博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Activator.CreateInstance(Type type)方法创建对象和Expression Tree创建对象性能的比较(终结版)...
阅读量:5314 次
发布时间:2019-06-14

本文共 2109 字,大约阅读时间需要 7 分钟。

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

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

 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 { 
get
set
; }
38 
    }

 

测试结果:

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

 

之所以这么测试,是因为Activator.CreateInstance()方法使用了缓存机制,所以对于表达式树创建对象也使用了缓存,没有新东西,只是一个总结而已。至于为什么Activator.CreateInstance方法创建对象比用表达式创建对象要慢, (友情提示:或许评论能带给你更多的东西呦)

转载于:https://www.cnblogs.com/WillMeng/archive/2009/12/08/Expression-Tree-Activator-Final.html

你可能感兴趣的文章
C#使用Xamarin开发可移植移动应用(2.Xamarin.Forms布局,本篇很长,注意)附源码
查看>>
jenkins搭建
查看>>
C#中使用Split分隔字符串的技巧
查看>>
eclipse的调试方法的简单介绍
查看>>
加固linux
查看>>
IPSP问题
查看>>
10.17动手动脑
查看>>
WPF中Image显示本地图片
查看>>
Windows Phone 7你不知道的8件事
查看>>
实用拜占庭容错算法PBFT
查看>>
java的二叉树树一层层输出,Java构造二叉树、树形结构先序遍历、中序遍历、后序遍历...
查看>>
php仿阿里巴巴,php实现的仿阿里巴巴实现同类产品翻页
查看>>
Node 中异常收集与监控
查看>>
Excel-基本操作
查看>>
面对问题,如何去分析?(分析套路)
查看>>
Excel-逻辑函数
查看>>
面对问题,如何去分析?(日报问题)
查看>>
数据分析-业务知识
查看>>
nodejs vs python
查看>>
poj-1410 Intersection
查看>>