博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
再比较动态调用代码
阅读量:6928 次
发布时间:2019-06-27

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

   上次在MSDN网站看到一个比较动态调用代码的文章,用到的例子似乎比较复杂,为计算一个复杂多项式子而将其中部分割开,动态形成代码段来被循环调用。详细看。今天看到微软C#团队的Eric Gunnerson写的另外一篇关于动态调用代码性能的比较文章,为了说明结果和计算的准确性,减少由于函数复杂而受编译优化的影响,他使用了一个极为简单的例子:

输入一个参数,然后返回这个参数加一,这么简单的函数,优化和没有优化的代码应该不会有差别的了。

None.gif    
public 
class Processor
ExpandedBlockStart.gif     {
InBlock.gif        
public 
int Process(
int value)
ExpandedSubBlockStart.gif        {
InBlock.gif            
return value + 1;
ExpandedSubBlockEnd.gif        }
ExpandedBlockEnd.gif    }
None.gif
None.gif

而对比方面,除了上次那几种外,还加了代理方式调用来进行比较。
1. 直接调用

None.gif
int value = processor.Process(i);

2. 用反射机制,Type.InvokeMember()调用。

None.gif    Type t = 
typeof(Processor);
None.gif    
int value = 
None.gif        (
int) t.InvokeMember(
None.gif                  "Process", 
None.gif         BindingFlags.Instance | BindingFlags.Public | 
None.gif                  BindingFlags.InvokeMethod, 
ExpandedBlockStart.gif                  
null, processor, 
new 
object[]  {i});
None.gif
None.gif

3. 通过一个接口

None.gif    
public 
interface IProcessor
ExpandedBlockStart.gif    {
InBlock.gif        
int Process(
int value);
ExpandedBlockEnd.gif    }
None.gif
None.gif

4. 通过一个委托Delegate

None.gif    
public 
delegate 
int ProcessCaller(
int value);
None.gif    ProcessCaller processCaller = 
new ProcessCaller(processor.Process);
None.gif    
int value = processCaller(i); 
None.gif
None.gif

5. 也通过反射机制建立委托再动态调用

None.gif    Type delegateType = CreateCustomDelegate(methodInfo);
None.gif    Delegate p = Delegate.CreateDelegate(delegateType, 
None.gif                                         process, "Process");
ExpandedBlockStart.gif    
int value = (
int) p.DynamicInvoke(
new 
object[]  {i});
None.gif
None.gif

6. 元编程方式

对于2和5由于使用反射机制,不可避免需要建立中间的临时对象去传递参数,将参数和返回值装箱等操作,因此花费了大量的机器时间。

下面是运行的某次结果(循环100000次):

dynaCall1.JPG



结论:

1.直接调用速度最快是肯定的。

2.接口调用比元编程速度快,而元编程又比委托方式快,但微软相信Whidbey会极大优化委托调用方式,从而使它接近接口调用的水平。

3.直接用Type的反射机制是速度最慢的,比用反射机制建立委托来动态调用还慢。

4.直接使用委托不够灵活,有时候需要用反射机制建立委托来调用,但会减低性能,希望Whidbey优化了委托的性能后这种情况可以改善,灵活是需要牺牲性能的。

本文转自风前絮~~博客园博客,原文链接:http://www.cnblogs.com/windsails/archive/2004/09/14/42793.html,如需转载请自行联系原作者

你可能感兴趣的文章
Maximal Rectangle
查看>>
Ubuntu 14.04 LTS中怎样解决系统设置残缺的问题
查看>>
ONE
查看>>
Jmeter常见问题
查看>>
Contoso 大学 - 3 - 排序、过滤及分页
查看>>
Sass介绍及入门教程
查看>>
libCurl的文件上传
查看>>
Can't call commit when autocommit=true(转)
查看>>
一分钟了解:String & StringBuilder & StringBuffer
查看>>
POJ2891:Strange Way to Express Integers(解一元线性同余方程组)
查看>>
如何调试Excel VBA代码
查看>>
写给自己看的小设计2 - 对象设计通用原则(序)
查看>>
学习HTML5之表单
查看>>
cocos2d-x 3.0来做一个简单的游戏教程 win32平台 vs2012 详解献给刚開始学习的人们!...
查看>>
Selenium2(WebDriver)总结(三)---元素定位方法
查看>>
SQLServer 2012异常问题(一)--故障转移群集+镜像环境导致作业执行失败
查看>>
【转】android 最新 NDK r8 在window下开发环境搭建 安装配置与使用 详细图文讲解,完整实际配置过程记录(原创)...
查看>>
ocp 1Z0-043 1-60题解析
查看>>
POJ 2777 Count Color(线段树+位运算)
查看>>
Android英文文档翻译系列(6)——LocalBroadcastManager
查看>>