迭戈

博客园 首页 新随笔 联系 管理
  11 随笔 :: 1 文章 :: 112 评论 :: 40274 阅读
文章有误,等待晚上的新版本。。。

对于
public static Object CreateInstance (
    Type type
)

方法我想您应该用过,当您需要动态的创建某些类型实例的时候您就需要它了。但是我今天测试该方法和用Expression Tree方法实例化对象的哪个执行的效率更快的时候,我发现一个问题。我把问题代码抽出来,做几个实验,您看看:(该实验在vs2008和vs2005下面都做了,实验结果一样,具体数值是vs2005下面的,以下代码均是在Release模式下)

复制代码
没有直接实例化的
1 Stopwatch watch1 = new Stopwatch();
2 watch1.Start();
3 Class1 formActivator1 = Activator.CreateInstance(typeof(Class1)) as Class1;
4 watch1.Stop();
5 Console.WriteLine("Activator CreateInstance");
6 Console.WriteLine(watch1.Elapsed.ToString());
7 
复制代码

 

 

得出的记过为:
Activator CreateInstance
00:00:00.0001561

我在前面加上如下代码:

Class1 c1 = new Class1();

 

再执行,我们看看结果:

Activator CreateInstance
00:00:00.0000203

 

您看到区别了吗?没有Class1 c1 = new Class1();的时候执行时间是有Class1 c1 = new Class1();执行时间的将近8倍。那么我们再看下面的代码:

复制代码
 1 Class1 c1 = new Class1();
 2 
 3 Stopwatch watch1 = new Stopwatch();
 4 watch1.Start();
 5 Class1 formActivator1 = Activator.CreateInstance(typeof(Class1)) as Class1;
 6 watch1.Stop();
 7 Console.WriteLine("Activator CreateInstance");
 8 Console.WriteLine(watch1.Elapsed.ToString());
 9 
10 Stopwatch watch2 = new Stopwatch();
11 watch2.Start();
12 Class1 formActivator2 = Activator.CreateInstance(typeof(Class1)) as Class1;
13 watch2.Stop();
14 Console.WriteLine("Activator CreateInstance");
15 Console.WriteLine(watch2.Elapsed.ToString());
复制代码

 

我们再一次执行方法Activator.CreateInstance(),您能想到执行结果吗?

Activator CreateInstance
00:00:00.0000206
Activator CreateInstance
00:00:00.0001156

 

吆喝,这个结果真是怪异啊!那么再来看这个:

复制代码
把实例化放在中间
 1 Stopwatch watch1 = new Stopwatch();
 2 watch1.Start();
 3 Class1 formActivator1 = Activator.CreateInstance(typeof(Class1)) as Class1;
 4 watch1.Stop();
 5 Console.WriteLine("Activator CreateInstance");
 6 Console.WriteLine(watch1.Elapsed.ToString());
 7 
 8 Class1 c1 = new Class1();
 9 
10 Stopwatch watch2 = new Stopwatch();
11 watch2.Start();
12 Class1 formActivator2 = Activator.CreateInstance(typeof(Class1)) as Class1;
13 watch2.Stop();
14 Console.WriteLine("Activator CreateInstance");
15 Console.WriteLine(watch2.Elapsed.ToString());
复制代码

 

您注意第八行,我们把实例化的代码放在中间了,那么结果又会怎么样呢?您请看:

Activator CreateInstance
00:00:00.0001715
Activator CreateInstance
00:00:00.0001111

 

和您预想的结果一样吗?
以下的疑问您能解答吗?
1. Activator.CreateInstance到底是怎么实例化对象的,和new有什么区别呢?
2. 为什么前面加上对象的直接实例化就会出现执行效率上的区别呢?
3. 为什么把直接实例化放在中间就没有相应的效果了呢?
4. 既然这样,那么我直接实例化两次对象用方法Activator.CreateInstance(),会不会第二次的执行时间要比第一次少很多呢?(我的实验结果,没有影响)

posted on   Will Meng  阅读(3154)  评论(6编辑  收藏  举报
编辑推荐:
· 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语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示