第七城市,电脑技术学院,与您一起学习的伙伴,您身边的教程中心

第七城市 logo
匿名投稿 投稿指南 RSS订阅
您现在的位置: 第七城市 >> 教程频道 >> 编程开发 >> ASP 编程 >> 正文

.Net中各种不同的对象创建方式的速度差异(四)

2010-2-26来源:不详 作者:佚名 点击:
本文章为本人个人博客相应文章的镜像:

原文地址: http://www.greatony.com/index.php/2010/02/24/speed-of-object-creation-in-dotnet-iv/

在这片文章中,我们暂时放一放Activator.CreateInstance(Type)和Activator.CreateInstance<T>()之间的性能差异,去探索一下,为什么使用泛型约束的速度和CreateInstance<T>()差不多(用屁股都能猜到应该是直接调用了CreateInstance<T>())。




首先我们写一个小程序来验证我们的猜想:

1 using System;
2
3 namespace GenericNew
4 {
5     public class Program
6     {
7         public static void Main(string[] args)
8         {
9             CreateInstance<Program>();
10             new Program();
11         }
12     
13         public static T CreateInstance<T>() where T: new()
14         {
15             return new T();
16         }
17     }
18 }


编译了以后用reflector来查看编译的结果:

1 public static T CreateInstance<T>() where T: new()
2 {
3     return new T();
4 }
5


看起来没有什么问题啊,跟写的时候一样美妙,也没有见到System.Activator.CreateInstance<T>()的踪影。

那么,让我们切换到msil模式看看:

1 .method public hidebysig static !!T CreateInstance<.ctor T>() cil managed
2 {
3     .maxstack 2
4     .locals init (
5         [0] !!T local,
6         [1] !!T local2)
7     L_0000: nop
8     L_0001: ldloca.s local2
9     L_0003: initobj !!T
10     L_0009: ldloc.1
11     L_000a: box !!T
12     L_000f: brfalse.s L_001c
13     L_0011: ldloca.s local2
14     L_0013: initobj !!T
15     L_0019: ldloc.1
16     L_001a: br.s L_0021
17     L_001c: call !!0 [mscorlib]System.Activator::CreateInstance<!!T>()
18     L_0021: stloc.0
19     L_0022: br.s L_0024
20     L_0024: ldloc.0
21     L_0025: ret
22 }


恩,发现[mscorlib]System.Activator::CreateInstance<!!T>()了,通过分析这段代码


责任编辑:sanda
推荐文章
| 关于我们 | 广告服务 | 用户条款 | 联系站长 | 版权申明 |