Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > .NET > C#.NET > 再比较动态调用代码
【标  题】:再比较动态调用代码
【关键字】:
【来  源】:http://windsails.cnblogs.com/archive/2004/09/14/42793.html

再比较动态调用代码

Your Ad Here

       上次在MSDN网站看到一个比较动态调用代码的文章,用到的例子似乎比较复杂,为计算一个复杂多项式子而将其中部分割开,动态形成代码段来被循环调用。详细看.NET下几种动态生成代码方式比较。今天看到微软C#团队的Eric Gunnerson写的另外一篇关于动态调用代码性能的比较文章,为了说明结果和计算的准确性,减少由于函数复杂而受编译优化的影响,他使用了一个极为简单的例子:
输入一个参数,然后返回这个参数加一,这么简单的函数,优化和没有优化的代码应该不会有差别的了。

    public class Processor
    
{
        
public int Process(int value)
        
{
            
return value + 1;
        }

    }



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

int value = processor.Process(i);

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

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

3. 通过一个接口

    public interface IProcessor
   
{
        
int Process(int value);
    }


4. 通过一个委托Delegate

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

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

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

6. 元编程方式

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

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




结论:
1.直接调用速度最快是肯定的。
2.接口调用比元编程速度快,而元编程又比委托方式快,但微软相信Whidbey会极大优化委托调用方式,从而使它接近接口调用的水平。
3.直接用Type的反射机制是速度最慢的,比用反射机制建立委托来动态调用还慢。
4.直接使用委托不够灵活,有时候需要用反射机制建立委托来调用,但会减低性能,希望Whidbey优化了委托的性能后这种情况可以改善,灵活是需要牺牲性能的。

相关代码

C#中"is" vs "as":【上一篇】
.NET建议使用的大小写命名原则:【下一篇】
【相关文章】
没有相关文章
【随机文章】
  • linux下JSP的配置过程
  • 编程交流与学习--More Effective C++的学习-Item M2:尽量使用C++风格的类型转换
  • mpd pptp server 配置实例
  • Samba&Active Directory配置资料之三
  • 一个下拉框中的日历
  • 依据递归算法,将给定的数组按从大到小的顺序排序,大家给点意见。
  • 在NetBeans IDE下开发Struts应用
  • Visual Basic变态用法之函数指针
  • Replace Disks With Internal FC-AL Under SVM
  • C#教程第三课:选择控制语句
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.