您的位置:首页 > 其它

改进的“以非泛型方式调用泛型方法”之基于DynamicMethod的实现

2007-03-22 17:06 686 查看
本文针对双鱼座同志的以非泛型方式调用泛型方法一文,提出一种更通用的以非泛型方式调用泛型方法的实现——基于DynamicMethod的实现。
基于DynamicMethod的实现的优点是,执行性能和双鱼座的文中实现的第5种方案——动态生成的非泛型接口包装相当(因为都是基于Emit的),但是,避免了原文实现中必须额外定义接口、Delegate的需要,从而,非常通用,应该是目前所能想到最佳实现。

首先,贴出原文中的测试数据相对于DynamicMethod实现的比较和缺点:

方案耗时比对其他优点
直接调用181不通用
泛型委托包装432.39不通用
反射16538918.78通用,不需额外定义
非泛型接口包装603.33通用,需要额外定义并实现
动态生成的非泛型接口包装724通用,需要额外定义
DynamicMethod实现724通用,无需额外定义
实现代码如下:

1 public abstract class DynamicMethodHelper
2 List<int> list = new List<int>();
2 System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
3 watch.Reset();
4 watch.Start();
5 for (int i = 0; i < REPEAT_TIME; i++)
6 watch.Stop();
10 long l1 = watch.ElapsedMilliseconds;
11 watch.Reset();
12 MethodInfo mi = typeof(Program).GetMethod("Add");
13 DynamicMethodHelper.DynamicMethodDelegate dmd = DynamicMethodHelper.GetDynamicMethodDelegate(mi, typeof(int));
14 watch.Start();
15 for (int i = 0; i < REPEAT_TIME; i++)
16 watch.Stop();
20 long l2 = watch.ElapsedMilliseconds;
21 Console.WriteLine("{0}\n{1} vs {2}", list.Count, l1, l2);
22 Console.ReadLine();

下载测试源代码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: