之所以要测试这个方法,是因为项目中要使用该方法动态创建需要对象。  

  上次说了方法Activator.CreateInstance()创建对象和直接用表达式创建对象的性能比较。被老赵等大牛批评测试方法不对,我决定再测试一下,测试环境和第一次一样。
  测试代码如下(其中Form1就是新建的一个WinForm,什么代码都没有写):

代码

 1 Stopwatch watch1 = new Stopwatch();
 2 watch1.Start();
 3 for (int i = 0; i < 10000; i++)
 4 {
 5      Form1 form1 = Activator.CreateInstance(typeof(Form1)) as Form1;
 6 }
 7 
 8 watch1.Stop();
 9 Console.WriteLine("Activator.CreateInstance");
10 Console.WriteLine(watch1.Elapsed.ToString());
11 
12 watch1.Reset();
13 watch1.Start();
14 for (int i = 0; i < 10000; i++)
15 {
16      Form form1 = GetCache.InstanceCacheEx.InstanceCache(typeof(Form1)) as Form1;
17 }
18 watch1.Stop();
19 Console.WriteLine("Expression.CreateInstanceEx");
20 Console.WriteLine(watch1.Elapsed.ToString());

而创建Expression Tree的代码如下:

创建Expression Tree,并缓存

 1     public class InstanceCachesEx
 2     {
 3         private Dictionary<Type, Func<object>> dicEx = new Dictionary<Type, Func<object>>();
 4         public object InstanceCache(Type key)
 5         {
 6 
 7             object value = null;
 8 
 9             if (dicEx.TryGetValue(key, out value))
10             {
11                 return value();
12             }
13             else
14             {
15                 value = CreateInstance(key);
16                 dicEx[key] = value;
17                 return value();
18             }
19         }
20 
21         static Func<object> CreateInstance(Type type)
22         {
23             NewExpression newExp = Expression.New(type);
24             Expression<Func<object>> lambdaExp = Expression.Lambda<Func<object>>(newExp, null);
25             Func<object> func = lambdaExp.Compile();
26             return func;
27         }
28     }
29 
30     public static class GetCache
31     {
32         static GetCache()
33         {
34             InstanceCacheEx = new InstanceCachesEx();
35         }
36 
37         public static InstanceCachesEx InstanceCacheEx { get; set; }
38     }

测试结果如下:

Activator.CreateInstance:
00:00:00.0140537
Expression.CreateInstanceEx:
00:00:00.7389382

吆呼,差了这么多......
我们换一个类来试试,来一个简单的类:

public class Class1 { }

再来看看测试结果:

Activator.CreateInstance
00:00:00.0020066
Expression.CreateInstance
00:00:00.0078841

嗯?结果方法Activator.CreateInstance()比表达式树要快了。
待续......

转载于:https://www.cnblogs.com/WillMeng/archive/2009/12/07/ExpressionTree-Activator-CreateInstance.html

再谈Activator.CreateInstance(Type type)方法创建对象和Expression Tree创建对象性能的比较(更新版)...相关推荐

  1. 再谈机器学习中的归一化方法(Normalization Method)

    机器学习.数据挖掘工作中,数据前期准备.数据预处理过程.特征提取等几个步骤几乎要花费数据工程师一半的工作时间.同时,数据预处理的效果也直接影响了后续模型能否有效的工作.然而,目前的大部分学术研究主要集 ...

  2. 一起谈.NET技术,关于Expression Tree和IL Emit的所谓的quot;性能差别quot;

    昨天写了<三种属性操作性能比较>,有个网友写信问我一个问题:从性能上看,Expression Tree和IL Emit孰优孰劣?虽然我在回信中作了简单的回答,但不知道这个网友是否懂我的意思 ...

  3. 关于Assembly.CreateInstance()与Activator.CreateInstance()方法

    关于Assembly.CreateInstance()与Activator.CreateInstance()方法 动态创建类对象,大多是Activator.CreateInstance()和Activ ...

  4. createinstance.java_C# Activator.CreateInstance()方法使用

    本文来自:http://blog.csdn.net/jaydawson/article/details/5539438 C#在类工厂中动态创建类的实例,所使用的方法为: 1. Activator.Cr ...

  5. python 元类的call_python3 全栈开发 - 内置函数补充, 反射, 元类,__str__,__del__,exec,type,__call__方法...

    python3 全栈开发 - 内置函数补充, 反射, 元类,__str__,__del__,exec,type,__call__方法 一, 内置函数补充 1,isinstance(obj,cls)检查 ...

  6. python3运行报错:TypeError: Object of type ‘type‘ is not JSON serializable解决方法(详细)

    python3运行报错:TypeError: Object of type 'type' is not JSON serializable解决方法(详细) 参考文章: (1)python3运行报错:T ...

  7. python中dtype什么意思_浅谈python 中的 type(), dtype(), astype()的区别

    如下所示: 函数 说明 type() 返回数据结构类型(list.dict.numpy.ndarray 等) dtype() 返回数据元素的数据类型(int.float等) 备注:1)由于 list. ...

  8. 拉普拉斯算子属于卷积方法吗_2020 年 GNN 开卷有益与再谈图卷积

    题记 2019 年,GNN 从来没有这样繁荣过.一方面,计算机视觉.自然语言处理等领域都忽如一夜春风来,反复"发现"了自身潜在的 Graph 结构,与 GNN 融合.另一方面,GN ...

  9. 报错:Parameter ‘XXX‘ implicitly has an ‘any‘ type.解决方法

    报错:Parameter 'XXX' implicitly has an 'any' type.解决方法 tsconfig.json添加"noImplicitAny": false ...

  10. python dtype什么意思_浅谈python 中的 type(), dtype(), astype()的区别

    如下所示: 函数 说明 type() 返回数据结构类型(list.dict.numpy.ndarray 等) dtype() 返回数据元素的数据类型(int.float等) 备注:1)由于 list. ...

最新文章

  1. RIFF格式声音文件的实现(转)
  2. java类中的代码块,Java开发避坑指南!
  3. 世卫组织总干事谭德塞:没有国家可以假装大流行已结束
  4. 7nmarm微架构鲲鹏服务器芯片,中国电信服务器集采:同方鲲鹏服务器拿下6000万元份额...
  5. 边缘计算时代来了,你准备好了吗?
  6. 作者:姚前(1970-),男,中国人民银行科技司教授级高级工程师
  7. ubuntu12.04 安装Android Studio笔记
  8. Android文件上传
  9. html5 判断页面加载,js判断页面是否加载完成的方法
  10. java 日期 yyyy_Java时间格式化时YYYY(大写)和yyyy(小写)的区别
  11. 开源掌机芯片方案对比
  12. LaMDA 是有感觉的吗?
  13. thinkbook15快捷键
  14. 第四回 还君明珠双泪垂,恨不相逢未嫁时
  15. Java IO Steam
  16. 友盟第三方QQ登录分享
  17. oracle新建一个自增列,sequence的使用
  18. 联想R720安装原装内存条图文过程
  19. 【音视频知识】MP4文件格式解析-详解
  20. php查询替换_如何在PHP中使用正则表达式进行查找替换

热门文章

  1. Unity Camera
  2. java memcached delete_Memcached删除/Delete数据
  3. javascript 面向对象的理解、数据属性的特征,基本数据类型、三大引用类型,方法
  4. Jxl实现Excel的导入与导出
  5. 文档对象模型(DOM)
  6. 设计模式,六大设计原则,类的特性
  7. Java 定时器 Timer 与 定时任务 TimeTask
  8. java 单词倒序_【Java】单词倒序输出
  9. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_13-页面静态化-数据模型-轮播图DataUrl接口...
  10. FZU 2092 收集水晶 BFS记忆化搜索