C# 4.0 Beta2改进之全新的dynamic
2010-09-30 21:05:35 来源:WEB开发网在C#4.0 b1中,dynamic的出现得到了很多人的关注,该关键字的出现能大幅改进某些情况下的开发效率,但是,通过大家对比测试,该方式同时也会带来很大的性能损失,方法的执行不过是对反射执行的封装,远不如使用Emit或者Expression编译委托来得快.但是在最新的C# 4.0 beta2中,dynamic的实现的得到了很大的改变.
首先使用测试程序对比下几种常见的方法调用.程序分别将对直接调用,传统反射调用,dynamic调用,expression调用,emit调用速度进行简单的对比,该对比程序只调用一个空方法,纯测试方法调用的耗时,如果测试有什么问题,欢迎提出.
下面给出测试主程序的源代码(完整代码见文后附带源码):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
namespace DynamicTest {
class Program {
static void Main(string[] args) {
TestClass staticInstanse = new TestClass();
dynamic dynamicInstanse = staticInstanse;
int num = 100000; //次数
var expressionFun = staticInstanse.GetExpressionCallFunction("TestMethod");
var emitFun = staticInstanse.GetEmitCallFunction("TestMethod");
var method = staticInstanse.GetType().GetMethod("TestMethod");
Console.WriteLine("开始对比测试(连续执行{0}次空方法):", num);
Stopwatch watch = new Stopwatch();
//测试直接调用
watch.Start();
for (int i = 0; i < num; i++) {
staticInstanse.TestMethod();
}
watch.Stop();
Console.WriteLine("直接调用耗时:{0} ms", watch.Elapsed.TotalMilliseconds);
//测试反射调用
watch.Reset();
watch.Start();
for (int i = 0; i < num; i++) {
method.Invoke(staticInstanse, null);
}
watch.Stop();
Console.WriteLine("使用反射调用耗时:{0} ms", watch.Elapsed.TotalMilliseconds);
//测试包含首次调用的dynamic调用
watch.Reset();
watch.Start();
for (int i = 0; i < num; i++) {
dynamicInstanse.TestMethod();
}
watch.Stop();
Console.WriteLine("使用包含首次调用的dynamic调用耗时:{0} ms", watch.Elapsed.TotalMilliseconds);
//测试出去首次调用后的dynamic调用
watch.Reset();
watch.Start();
for (int i = 0; i < num; i++) {
dynamicInstanse.TestMethod();
}
watch.Stop();
Console.WriteLine("使用去掉首次调用的dynamic调用耗时:{0} ms", watch.Elapsed.TotalMilliseconds);
//测试expression调用
watch.Reset();
watch.Start();
for (int i = 0; i < num; i++) {
expressionFun(staticInstanse);
}
watch.Stop();
Console.WriteLine("使用Expression调用耗时:{0} ms", watch.Elapsed.TotalMilliseconds);
//测试emit调用
watch.Reset();
watch.Start();
for (int i = 0; i < num; i++) {
emitFun(staticInstanse);
}
watch.Stop();
Console.WriteLine("使用Emit调用耗时:{0} ms", watch.Elapsed.TotalMilliseconds);
}
}
}
- ››改进 WebSphere ESB V6.1 中记录的消息的显示
- ››全新动画闪字出炉 美图秀秀新版推荐
- ››全新高清场景 可牛影像2.4正式版
- ››全新引擎速度飙升 IE9技术预览版抢先体验
- ››全新页面,焕然一新—歪歪(YY)2.0正式版体验
- ››全新界面更强功能 抢先试用风行2.0
- ››改进Win 7在netbook上的启动和关机时间
- ››全新架构亮相 向6版靠近 迅雷5.9全面试用
- ››全新 飞信3.0 Java手机端发布
- ››全新的Outlook2007客户管理系统
- ››改进的ASP备份SQLServer数据库
- ››改进BitLocker,浅谈 Vista SP1 中的磁盘加密技术...
更多精彩
赞助商链接