服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - 详解C#实例化对象的三种方式及性能对比

详解C#实例化对象的三种方式及性能对比

2022-10-21 13:16背过手 C#

这篇文章主要介绍了C#实例化对象的三种方式及性能对比,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

做项目过程中有个需求要实例化两万个对象并添加到List

中,这个过程大概需要1min才能加载完(传参较多),于是开启了代码优化之旅,再此记录。

首先想到的是可能实例化比较耗时,于是开始对每种实例化方式进行测试,过程如下

实例化方式

1、用 New 关键字实例化一个类

2、用 Activator 实例化一个类

3、用 Assembly 实例化一个类

代码实现

测试环境:

vs2019 .NET Framework 4.7

Intel Core i7-10510U CPU

首先定义一个类Person

?
1
2
3
4
5
6
7
8
9
10
11
public class Person
{
 public Person()
 {
 }
 public Person(string name)
 {
  Name = name;
 }
 public string Name { get; set; }
}

我们先在无参的构造函数中实例化,每种方式进行十次,每次实例化十万次,代码如下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
static void Main(string[] args)
  {
   Console.WriteLine("实例化对象的耗时比较(单位:毫秒)");
   Console.Write("     ");
   for (int i = 1; i <= 10; i++)
    Console.Write("{0:G}", i.ToString().PadLeft(5));
   Console.Write("\n");
   Console.Write("InstanceByNew".PadRight(20));
   for (int i = 1; i <= 10; i++)
   {
    Person person = null;
    Stopwatch watch = new Stopwatch();
    watch.Start();
    for (int j = 0; j < 100000; j++)
     person = new Person();
    watch.Stop();
    Console.Write(watch.ElapsedMilliseconds.ToString().PadLeft(5));
   }
   Console.Write("\n");
   Console.Write("InstanceByActivator".PadRight(20));
   for (int i = 1; i <= 10; i++)
   {
    Type type = Type.GetType("ConsoleApp1.Person");
    Person person = null;
 
    Stopwatch watch = new Stopwatch();
    watch.Start();
    for (int j = 0; j < 100000; j++)
    {
     object obj = Activator.CreateInstance(type);
     person = obj as Person;
    }
    watch.Stop();
    Console.Write(watch.ElapsedMilliseconds.ToString().PadLeft(5));
   }
   Console.Write("\n");
   Console.Write("InstanceByAssembly".PadRight(20));
   for (int i = 1; i <= 10; i++)
   {
    Assembly assembly = Assembly.Load("InstancePerformance");
    Person person = null;
 
    Stopwatch watch = new Stopwatch();
    watch.Start();
    for (int j = 0; j < 100000; j++)
    {
     object obj = assembly.CreateInstance("ConsoleApp1.Person");
     person = obj as Person;
    }
    watch.Stop();
    Console.Write(watch.ElapsedMilliseconds.ToString().PadLeft(5));
   }
   Console.Write("\n");
   Console.ReadKey();
  }

执行结果如下:

详解C#实例化对象的三种方式及性能对比

然后来看下有参构造函数中实例化的代码和结果

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
static void Main(string[] args)
  {
   Console.WriteLine("实例化对象的耗时比较(单位:毫秒)");
   Console.Write("     ");
   for (int i = 1; i <= 10; i++)
    Console.Write("{0:G}", i.ToString().PadLeft(5));
   Console.Write("\n");
   Console.Write("InstanceByNew".PadRight(20));
   for (int i = 1; i <= 10; i++)
   {
    Person person = null;
    Stopwatch watch = new Stopwatch();
    watch.Start();
    for (int j = 0; j < 100000; j++)
     person = new Person("Test"+j);
    watch.Stop();
    Console.Write(watch.ElapsedMilliseconds.ToString().PadLeft(5));
   }
   Console.Write("\n");
   Console.Write("InstanceByActivator".PadRight(20));
   for (int i = 1; i <= 10; i++)
   {
    Type type = Type.GetType("ConsoleApp1.Person");
    Person person = null;
 
    Stopwatch watch = new Stopwatch();
    watch.Start();
    for (int j = 0; j < 100000; j++)
    {
     object obj = Activator.CreateInstance(type,new object[]{"Test"+j});
     person = obj as Person;
    }
    watch.Stop();
    Console.Write(watch.ElapsedMilliseconds.ToString().PadLeft(5));
   }
   Console.Write("\n");
   Console.Write("InstanceByAssembly".PadRight(20));
   for (int i = 1; i <= 10; i++)
   {
    Assembly assembly = Assembly.Load("InstancePerformance");
    Person person = null;
 
    Stopwatch watch = new Stopwatch();
    watch.Start();
    for (int j = 0; j < 100000; j++)
    {
     object obj = assembly.CreateInstance("ConsoleApp1.Person", true, System.Reflection.BindingFlags.Default, null, new []{"Test"+j}, null, null);
     person = obj as Person;
    }
    watch.Stop();
    Console.Write(watch.ElapsedMilliseconds.ToString().PadLeft(5));
   }
   Console.Write("\n");
   Console.ReadKey();
  }

执行结果如下:

详解C#实例化对象的三种方式及性能对比

结论

从上面的执行结果可以看出这三种方式的性能排序为

New > Activator > Assembly

但使用哪种方法还要视情况而定

后续

以上可以看出New性能最高,而我就是使用的New,问题还没解决,把问题指向判断List是否存在某元素上,于是开始测试List中的Contains, Exists, Any,Where。详情请点击.

到此这篇关于C#实例化对象的三种方式及性能对比的文章就介绍到这了,更多相关C#实例化对象的三种方式及性能对比内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://www.cnblogs.com/ziqinchao/p/14116809.html

延伸 · 阅读

精彩推荐
  • C#Unity实现已知落点和速度自动计算发射角度

    Unity实现已知落点和速度自动计算发射角度

    这篇文章主要为大家详细介绍了Unity实现已知落点和速度自动计算发射角度,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以...

    10142022-08-24
  • C#Unity3D Shader实现扫描显示效果(2)

    Unity3D Shader实现扫描显示效果(2)

    这篇文章主要为大家详细介绍了Unity3D Shader实现扫描显示效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    星空不语4232022-07-08
  • C#C#获取远程XML文档的方法

    C#获取远程XML文档的方法

    这篇文章主要介绍了C#获取远程XML文档的方法,涉及C#文件传输与XML文档操作相关技巧,需要的朋友可以参考下...

    礼拜一5382021-11-08
  • C#C#实现字符串首字母大写的方法示例

    C#实现字符串首字母大写的方法示例

    这篇文章主要给大家介绍了关于利用C#实现字符串首字母大写的相关资料,这是在最近工作中遇到的一个需求,文中通过示例代码介绍的非常详细,对大家...

    lindexi5222022-02-19
  • C#C#中多态性的实现

    C#中多态性的实现

    这篇文章主要介绍了C#中多态性的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编...

    LLLLL__5692022-08-24
  • C#C# 正则表达式进阶

    C# 正则表达式进阶

    这篇文章主要介绍了C# 正则表达式进阶,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编...

    丹枫无迹8022022-08-27
  • C#轻松学习C#的ArrayList类

    轻松学习C#的ArrayList类

    轻松学习C#的ArrayList类,对C#的ArrayList类感兴趣的朋友可以参考本篇文章,帮助大家更灵活的运用C#的ArrayList类。...

    丿木呈广予口贝5532021-11-04
  • C#c#中LINQ的基本用法实例

    c#中LINQ的基本用法实例

    语言集成查询 (LINQ) 是 Visual Studio 2008 和 .NET Framework 3.5 版中引入的一项创新功能。下面这篇文章主要给大家介绍了关于c#中LINQ的基本用法,需要的朋友可以...

    阡陌染6222022-03-09