详解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
但使用哪种方法还要视情况而定
后续
以上可以看出New性能最高,而我就是使用的New,问题还没解决,把问题指向判断List是否存在某元素上,于是开始测试List中的Contains, Exists, Any,Where。详情请点击.
到此这篇关于C#实例化对象的三种方式及c#教程性能对比的文章就介绍到这了,更多相关C#实例化对象的三种方式及性能对比内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持
详解C#实例化对象的三种方式及性能对比相关推荐
- html正方形边框,详解HTML设置边框的三种方式
HTML设置边框的三种方式 border-width: 1px 2px 2px; border-style: solid dashed dotted; border-color:red green b ...
- java全局异常处理_详解Spring全局异常处理的三种方式
在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的.不可预知的异常需要处理.每个过程都单独处理异常,系统的代码耦合度高,工作 ...
- 详解Springboot下载Excel的三种方式
https://www.jb51.net/article/216656.htm 汇总一下浏览器下载和代码本地下载实现的3种方式. (其实一般都是在代码生成excel,然后上传到oss,然后传链接给前台 ...
- html正方形边框,详解HTML设置边框的三种方式(html画方框用border)
代码如下 <!DOCTYPE html> <html> <head> <style> .square{ ...
- python调用cmd命令释放端口_详解python调用cmd命令三种方法
目前我使用到的python中执行cmd的方式有三种 使用os.system("cmd") 该方法在调用完shell脚本后,返回一个16位的二进制数,低位为杀死所调用脚本的信号号码, ...
- python可以播放音乐吗_详解python播放音频的三种方法
第一种 使用pygame模块 pygame.mixer.init() pygame.mixer.music.load(self.wav_file) pygame.mixer.music.set_vol ...
- python如何安装matplotlib_详解python安装matplotlib库三种失败情况
(可能只有最后一句命令有用,可能全篇都没用) (小白方法,可能只适用于本人情况) 安装matplotlib时,出现的三种失败情况 1.read timed out 一开始我在pycharm终端使用pi ...
- mysql临键锁_详解 MySql InnoDB 中的三种行锁(记录锁、间隙锁与临键锁)
详解 MySql InnoDB 中的三种行锁(记录锁.间隙锁与临键锁) 前言 InnoDB 通过 MVCC 和 NEXT-KEY Locks,解决了在可重复读的事务隔离级别下出现幻读的问题.MVCC ...
- Spring框架学习教程,详解Spring注入bean的几种方式
首先,要学习Spring中的Bean的注入方式,就要先了解什么是依赖注入. 依赖注入是指:让调用类对某一接口的实现类的实现类的依赖关系由第三方注入,以此来消除调用类对某一接口实现类的依赖. Sprin ...
最新文章
- Verlet Integration
- Python绘图 二维、三维
- 信息系统项目管理知识--知识产权与标准化
- 精通jQuery选择器使用 转一篇
- 分享Silverlight/WPF/Windows Phone一周学习导读(1月9日-1月16日)
- spring学习(40):注入数组类型
- 【HDU - 1276】士兵队列训练问题 (报数问题 模拟)
- JVM虚拟机-Class文件之常量池
- Python类的调用之同一个文件里面
- SQL server 数据加密
- 群晖NAS教程(一) 、利用Docker安装MySQL8并远程访问
- 金蝶K3cloud 7.6注册教程
- 信用卡逾期怎么办,如何让信用卡不逾期?
- C语言 输入一个不大于五位的数字,先判断是几位数字,然后将其数字顺序输出和逆序输出
- smali语言程序流程控制语法
- 莫列波纹(Moiré pattern)与Banding
- 对 捕鱼达人1.01 的全程破解分析
- 建模计算机处理器,实战建模渲染,用锐龙7 5800X拒绝拖稿
- 邓白氏编码官方查询地址
- 软件测试的正向思维,反向思维