C#实例化对象的三种方式及性能对比
前言
做项目过程中有个需求要实例化两万个对象并添加到List中,这个过程大概需要1min才能加载完(传参较多),于是开启了代码优化之旅,再此记录。
首先想到的是可能实例化比较耗时,于是开始对每种实例化方式进行测试,过程如下
实例化方式
1、用 New 关键字实例化一个类
2、用 Activator 实例化一个类
3、用 Assembly 实例化一个类
代码实现
测试环境:
vs2019 .NET Framework 4.7
Intel Core i7-10510U CPU
首先定义一个类Person
public class Person
{
public Person()
{
}
public Person(string name)
{
Name = name;
}
public string Name { get; set; }
}
我们先在无参的构造函数中实例化,每种方式进行十次,每次实例化十万次,代码如下
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();
}
执行结果如下:

然后来看下有参构造函数中实例化的代码和结果
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();
}
执行结果如下:

结论
从上面的执行结果可以看出这三种方式的性能排序为
New > Activator > Assembly
但使用哪种方法还要视情况而定
C#实例化对象的三种方式及性能对比的更多相关文章
- Dynamics CRM2016 查询数据的三种方式的性能对比
之前写过一个博客,对非声明验证方式下连接组织服务的两种方式的性能进行了对比,但当时只是对比了实例化组织服务的时间,并没有对查询数据的时间进行对比,那有朋友也在我的博客中留言了反映了查询的时间问题,一直 ...
- Java反射02 : Class对象获取的三种方式和通过反射实例化对象的两种方式
1.Class对象获取的三种方式 本文转载自:https://blog.csdn.net/hanchao5272/article/details/79361463 上一章节已经说过,一般情况下,Jav ...
- Java反射机制(创建Class对象的三种方式)
1:了解什么是反射机制? 在通常情况下,如果有一个类,可以通过类创建对象:但是反射就是要求通过一个对象找到一个类的名称: 2:在反射操作中,握住一个核心概念: 一切操作都将使用Object完成,类 ...
- Spring学习之实例化bean的三种方式
实例化bean的三种方式 构造器实例化bean Person.java public class Person { private String name; private Integer age; ...
- JDBC 创建连接对象的三种方式 、 properties文件的建立、编辑和信息获取
创建连接对象的三种方式 //第一种方式 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/ ...
- Java反射机制(创建Class对象的三种方式)
1:SUN提供的反射机制的类: java.lang.Class<T> java.lang.reflect.Constructor<T> java.lang.reflect.Fi ...
- 【java】实例化对象的3种方式:new、clone、反射
实例化对象的3种方式:new.clone.反射
- 反射:获取Class对象的三种方式
获取Class对象的三种方式 package lianxiApril18; /** * 获取Class对象的三种方式 * 1 Object ——> getClass(); * 2 任何数据类型( ...
- Java反射获取类对象的三种方式
package demo01; /* * 获取一个类的class文件对象的三种方式 * 1.对象获取 * 2.类名获取 * 3.Class类的静态方法获取 */ public class Reflec ...
随机推荐
- JS变量、作用域和内存问题
一.基本类型和引用类型 1. 基本类型值指的是简单的数据段,引用类型值指那些可能由多个值组成的对象. 2. 基本类型值按值访问,引用类型值按引用访问: 按值访问对于基本类型而言,不同变量指向的地址空间 ...
- rpm命令介绍
rpm安装不能指定安装位置. 查看系统安装了哪些软件:rpm -qa rpm -qa |grep keyword (q:query a 是all) 查看软件是否安装: rpm -q ...
- Pytest学习(十) - parametrize、fixture、request的混合使用
一.前言 上篇文章有提及pytest.mark.parametrize的使用,这次在此基础上结合fixture和request再做个延伸. 二.传单个参数 即一个参数一个值,示例代码如下: # 传单个 ...
- synchronized 到底该不该用?
我是风筝,公众号「古时的风筝」,一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农! 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在 ...
- 读取由FileProvider创建的Uri路径文件
val uri = intent.clipData.getItemAt(0).uri //读取由FileProvider传递的uri文件val fileDecript= contentResolver ...
- classmethod、staticclassmethod内置装饰器函数
# method 英文是方法的意思 # classmethod 类方法 # 当一个类中的方法中只涉及操作类的静态属性时,此时在逻辑上,我们想要直接通过类名就可以调用这个方法去修改类的静态属性,此时可以 ...
- a标签中的target
html中target四种选择_blank._parent._self._top,分别是什么意思? eg:<Cell title="Open link in new window&qu ...
- Weevely使用方法以及通信流量分析
Weevely简介 weevely项目地址:点击查看 weevely是一款针对PHP的webshell的自由软件,可用于模拟一个类似于telnet的连接shell,weevely通常用于web程序的漏 ...
- ESP定律脱壳——NsPack3.x脱壳
首先进行查壳,NsPack 将程序拖入x64dbg 程序入口处标志性的push F8单步,发现仅有esp寄存器有变化 在esp上右键,在内存窗口查看,下硬件断点 F9运行程序,程序断在pop之后. 使 ...
- 深度分析:Java 静态方法/变量,非静态方法/变量的区别,今天一并帮你解决!
静态/非静态 方法/变量的写法 大家应该都明白静态方法/字段比普通方法/字段的写法要多一个static关键字,简单写下他们的写法吧,了解的可以直接略过 class Test{ // 静态变量 publ ...