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

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

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

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

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



从前面的文章,我们发现以下两点有趣的东西:



使用System.Activator的非泛型方法比使用泛型方法快很多(超过200%)
使用泛型约束和new关键字创建的速度几乎和System.Activator的泛型方法的一样


在这篇文章里,我将会这两个问题做一个进一步的探究,我使用的工具就是鼎鼎大名的.Net反编译工具:Reflector,欢迎读者跟我一起探讨造成这个现象的原因。

第一段 从System.Activator.CreateInstance(Type)开始

我们先用Reflector打开.Net Framework 3.5中的mscorlib.dll,看看这里面,微软是怎么实现的。

首先看看System.Activator.CreateInstance(Type),它直接调用了System.Activator.CreateInstance(Type, Boolean),代码如下

1 public static object CreateInstance(Type type)
2 {
3     return CreateInstance(type, false);
4 }


那么这个CreateInstance(Type, Boolean)的实现,是这样的:

1 public static object CreateInstance(Type type, bool nonPublic)
2 {
3     if (type == null)
4     {
5         throw new ArgumentNullException("type");
6     }
7     RuntimeType underlyingSystemType = type.UnderlyingSystemType as RuntimeType;
8     if (underlyingSystemType == null)
9     {
10         throw new ArgumentException(Environment.GetResourceString("Arg_MustBeType"), "type");
11     }
12     return underlyingSystemType.CreateInstanceImpl(!nonPublic);
13 }
14


将这段代码简化一下,就是:

1 public static object CreateInstance(Type type, bool nonPublic)
2 {
3     RuntimeType underlyingSystemType = type.UnderlyingSystemType as RuntimeType;
4     return underlyingSystemType.CreateInstanceImpl(!nonPublic);
5 }
6


在RuntimeType的CreateInstanceImpl(bool isPublic)中,直接调用了CreateInstanceImpl(bool isPublic, bool skipVisibilityCheck, bool fillCache),这个函数的实现非常有意思,我先把代码贴出来:

1 internal object CreateInstanceImpl(bool publicOnly, bool skipVisibilityChecks, bool fillCache)
2 {
3     RuntimeTypeHandle typeHandle = this.TypeHandle;
4     ActivatorCache cache = s_ActivatorCache;
5     if (cache != null)
6     {
7         ActivatorCacheEntry entry = cache.GetEntry(this);
8         if (entry != null)
9         {
10             if ((publicOnly && (entry.m_ctor != null)) && ((entry.m_hCtorMethodHandle.GetAttributes() & MethodAttri


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