改进的“以非泛型方式调用泛型方法”之基于DynamicMethod的实现
2007-03-22 17:06
686 查看
本文针对双鱼座同志的以非泛型方式调用泛型方法一文,提出一种更通用的以非泛型方式调用泛型方法的实现——基于DynamicMethod的实现。
基于DynamicMethod的实现的优点是,执行性能和双鱼座的文中实现的第5种方案——动态生成的非泛型接口包装相当(因为都是基于Emit的),但是,避免了原文实现中必须额外定义接口、Delegate的需要,从而,非常通用,应该是目前所能想到最佳实现。
首先,贴出原文中的测试数据相对于DynamicMethod实现的比较和缺点:
实现代码如下:
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();
下载测试源代码
基于DynamicMethod的实现的优点是,执行性能和双鱼座的文中实现的第5种方案——动态生成的非泛型接口包装相当(因为都是基于Emit的),但是,避免了原文实现中必须额外定义接口、Delegate的需要,从而,非常通用,应该是目前所能想到最佳实现。
首先,贴出原文中的测试数据相对于DynamicMethod实现的比较和缺点:
方案 | 耗时 | 比对 | 其他优点 |
直接调用 | 18 | 1 | 不通用 |
泛型委托包装 | 43 | 2.39 | 不通用 |
反射 | 16538 | 918.78 | 通用,不需额外定义 |
非泛型接口包装 | 60 | 3.33 | 通用,需要额外定义并实现 |
动态生成的非泛型接口包装 | 72 | 4 | 通用,需要额外定义 |
DynamicMethod实现 | 72 | 4 | 通用,无需额外定义 |
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();
下载测试源代码
相关文章推荐
- 改进的“以非泛型方式调用泛型方法”之基于DynamicMethod的实现
- 改进的“以非泛型方式调用泛型方法”之基于DynamicMethod的实现
- 以非泛型方式调用泛型方法
- 以非泛型方式调用泛型方法
- 以非泛型方式调用泛型方法
- 以非泛型方式调用泛型方法(一) 推荐
- 以非泛型方式调用泛型方法 (二)
- 以非泛型方式调用泛型方法
- 以非泛型方式调用泛型方法(三)
- 以非泛型方式调用泛型方法
- 以非泛型方式调用泛型方法
- 对《以非泛型方式调用泛型方法》一文的探讨
- 对《以非泛型方式调用泛型方法》一文的探讨
- 以非泛型方式调用泛型方法
- 基于Qt有限状态机人工智能的一种实现及改进方法
- 多层数据库应用基于Delphi DataSnap方法调用的实现(一)返回数据集
- Python基于QRCode实现生成二维码的方法【下载,安装,调用等】
- xcode基于视图的实现文件中各方法调用的时机
- Struts2_基于XML配置方式对指定action方法实现输入校验、基于XML校验的一些特点
- js实现类似于add(1)(2)(3)调用方式的方法