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 ...
随机推荐
- 包装类和基本数据类型(以int和Integer为例)
Java的包装类就是可以直接将简单类型的变量表示为一个类.java共有六个包装类:Integer,Long,Float,Double,Character,Boolean,对应六种基本数据类型. 包装类 ...
- 消失的两个数字(1-N缺两个数)
给定一个数组,包含从 1 到 N 所有的整数,但其中缺了两个数字.你能在 O(N) 时间内只用 O(1) 的空间找到它们吗? 以任意顺序返回这两个数字均可. 示例 1: 输入: [1]输出: [2,3 ...
- Python 中 'unicodeescape' codec can't decode bytes in position XXX: trun错误解决方案
window 读取文件可以用\,但是在字符串中\是被当作转义字符来使用,'C:\Users\FrankYuan\Pictures\Camera Roll\WIN_20161010_08_51_57_P ...
- 这才是图文并茂:我写了1万多字,就是为了让你了解AQS是怎么运行的
前言 如果你想深入研究Java并发的话,那么AQS一定是绕不开的一块知识点,Java并发包很多的同步工具类底层都是基于AQS来实现的,比如我们工作中经常用的Lock工具ReentrantLock.栅栏 ...
- 2w+长文带你剖析ConcurrentHashMap~!
并发编程实践中,ConcurrentHashMap是一个经常被使用的数据结构,相比于Hashtable以及Collections.synchronizedMap(),ConcurrentHashMap ...
- PEP8编程规范
1.PEP8编程规范 [少加空格多写注释,严格对齐] 1.缩进 缩进table = 4个空格:设置好后使用编辑器的自然table 2.if条件书写规范 if的条件多的时候用左边括号对齐:if条件完毕后 ...
- [原题复现+审计][BJDCTF2020]Mark loves cat($$导致的变量覆盖问题)
简介 原题复现:https://gitee.com/xiaohua1998/BJDCTF2020_January 考察知识点:$$导致的变量覆盖问题 线上平台:https://buuoj.cn( ...
- day02-业务服务监控
提供大量第三方工具,可以开发企业级服务监控平台,本章涉及文件与目录差异对比.HTTP质量监控.邮件告警等内容一.文件内容差异比对1.示例1 d = difflib.Differ() diff = d. ...
- Java的BigDecimal,对运算封装
添加maven依赖 <dependency> <groupId>com.google.guava</groupId> <artifactId>guava ...
- 思维导图MindManager流程图有哪些功能
流程图是思维导图中的一种图表,应用相当广泛.MindManager 2020作为专业的思维导图软件,更加强了流程图的功能,让用户能使用更加简便的MindManager技巧绘制流程图.接下来,就让我们一 ...