WEB开发网
开发学院软件开发C语言 C# 4.0 Beta2改进之全新的dynamic 阅读

C# 4.0 Beta2改进之全新的dynamic

 2010-09-30 21:05:35 来源:WEB开发网   
核心提示:在C#4.0 b1中,dynamic的出现得到了很多人的关注,该关键字的出现能大幅改进某些情况下的开发效率,但是,通过大家对比测试,该方式同时也会带来很大的性能损失,方法的执行不过是对反射执行的封装,远不如使用Emit或者Expression编译委托来得快.但是在最新的C# 4.0 beta2中,dynamic的实现的

在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);
        }
    }
}

1 2  下一页

Tags:Beta 改进 全新

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接