迭戈

博客园 首页 新随笔 联系 管理
  11 随笔 :: 1 文章 :: 112 评论 :: 40274 阅读

  这应该是这个文章的最终版本了,期间犯了不少错误,也学习到了不少东西。

  不多说了,直接上代码。还是我最后的测试结果,代码很简单,不解释了。

复制代码
 1             Stopwatch watch1 = new Stopwatch();
 2 
 3             watch1.Start();
 4             for (int i = 0; i < 1000000; i++)
 5             {
 6                 Activator.CreateInstance(typeof(Class1));
 7             }
 8 
 9             watch1.Stop();
10             Console.WriteLine("Activator.CreateInstance");
11             Console.WriteLine(watch1.Elapsed.ToString());
12 
13             watch1.Reset();
14             watch1.Start();
15             for (int i = 0; i < 1000000; i++)
16             {
17                 GetCache.InstanceCacheEx.InstanceCache(typeof(Class1));
18             }
19             watch1.Stop();
20             Console.WriteLine("Expression.CreateInstanceEx");
21             Console.WriteLine(watch1.Elapsed.ToString());
22 
23 
24             watch1.Reset();
25             watch1.Start();
26             for (int i = 0; i < 1000000; i++)
27             {
28                 new Class1();
29             }
30             watch1.Stop();
31             Console.WriteLine("Direct CreateInstance");
32             Console.WriteLine(watch1.Elapsed.ToString());
复制代码

 

表达式树构建和缓存:

复制代码
 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             Func<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 { getset; }
38     }
复制代码

 

测试结果:

Activator.CreateInstance:
00:00:00.2221068
Expression.CreateInstanceEx:
00:00:00.0845797
Direct CreateInstance
00:00:00.0071313

 

之所以这么测试,是因为Activator.CreateInstance()方法使用了缓存机制,所以对于表达式树创建对象也使用了缓存,没有新东西,只是一个总结而已。至于为什么Activator.CreateInstance方法创建对象比用表达式创建对象要慢,您可以看这篇文章(友情提示:或许评论能带给你更多的东西呦)
posted on   Will Meng  阅读(2976)  评论(8编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示