再比较动态调用代码

文章介绍了.NET下几种动态生成代码方式的比较。先是提到MSDN网站上复杂多项式动态调用代码的例子,后又讲述微软C#团队Eric Gunnerson用简单函数对比动态调用代码性能,对比方式有直接调用、反射机制调用、接口调用等,还指出使用反射机制会花费大量机器时间,并给出某次运行结果。

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

None.gif public class Processor
ExpandedBlockStart.gif
{
InBlock.gif
publicintProcess(intvalue)
ExpandedSubBlockStart.gif
{
InBlock.gif
returnvalue+1;
ExpandedSubBlockEnd.gif}

ExpandedBlockEnd.gif}

None.gif
None.gif


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

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

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

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

3. 通过一个接口

None.gif public interface IProcessor
ExpandedBlockStart.gif
{
InBlock.gif
intProcess(intvalue);
ExpandedBlockEnd.gif}

None.gif
None.gif

4. 通过一个委托Delegate

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

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

None.gif TypedelegateType = CreateCustomDelegate(methodInfo);
None.gifDelegatep
= Delegate.CreateDelegate(delegateType,
None.gifprocess,
" 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优化了委托的性能后这种情况可以改善,灵活是需要牺牲性能的。

相关代码

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值