• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    浅谈.NET反射机制的性能优化 附实例下载
    可能大家谈到反射面部肌肉都开始抽搐了吧!因为在托管语言里面,最臭名昭著的就是反射!它的性能实在是太低了,甚至在很多时候让我们无法忍受。不过不用那么纠结了,老陈今天就来分享一下如何来优化反射!

    概述
    本文涉及到的反射优化的途径有如下两种:

    通过Delegate.CreateDelegate()创建委托进行优化
    通过.NET4的动态运行时进行优化
    如果您还知道其他更加有效的优化途径,请不吝赐教!

    准备工作
    今天我们总计要对比五种不同的调用对象成员的方式,也算是一种性能测评。

    在开始之前,我们首先定义一个简单的对象和一个方法,以供测试之用:
    复制代码 代码如下:

    namespace ReflectionOptimization
    {
    public sealed class TestObject
    {
    public int Add(int a, int b)
    {
    // 简单演示
    return a + b;
    }
    }
    }

    这个类非常简单,只提供了一个方法,这个方法返回两个整形的和。接下来我们看看执行时间测量的代码,很简单,想必您已经驾轻就熟了:
    复制代码 代码如下:

    private static double _Run(string description, Actionint, int> action, int a, int b)
    {
    if (action == null) throw new ArgumentNullException("action");

    // 启动计时器
    var stopwatch = Stopwatch.StartNew();

    // 运行要测量的代码
    action(a, b);

    // 终止计时
    stopwatch.Stop();

    // 输出结果
    Console.WriteLine("{0}: {1}", description, stopwatch.Elapsed.TotalMilliseconds.ToString(CultureInfo.InvariantCulture));

    // 返回执行时间
    return stopwatch.Elapsed.TotalMilliseconds;
    }

    以上测量时间的方法返回了执行时间,因为我们要在后面用到这个值,在执行多次之后取个平均值,以求测试的公平性、权威性。

    编码实现
    首先我们来看看原生反射的实现:
    复制代码 代码如下:

    var obj = new TestObject();
    var add = obj.GetType().GetMethod("Add");

    for (var i = 0; i _TIMES; i++) add.Invoke(obj, new object[] {a, b});

    然后我们看看.NET4动态编程的实现:
    复制代码 代码如下:

    dynamic obj = new TestObject();

    // 有木有发现这个代码超级简单?
    for (var i = 0; i _TIMES; i++) obj.Add(a, b);

    最后我们看看如何使用委托来优化反射:
    复制代码 代码如下:

    // 委托
    public delegate int AddMethod(int a, int b);

    // 实现
    var obj = new TestObject();
    var objType = obj.GetType();
    var add = objType.GetMethod("Add");
    var d = (AddMethod)Delegate.CreateDelegate(typeof(AddMethod), obj, add);

    for (var i = 0; i _TIMES; i++) d(a, b);

    上面的代码看起来多了几行,而且还需要自定义一个委托,写起来挺麻烦的。因此我们的测试代码里面还实现了另外一种形式,其实它也是委托:

    var d = (FuncTestObject, int, int, int>)Delegate.CreateDelegate(typeof(FuncTestObject, int, int, int>), add);

    测试总结
    我们首先在Debug模式下将整个测试代码运行5遍,然后分别记录平均值,然后再到Release模式下重复该测试。

    测试的过程不再阐述,测试结果整理如下:

    Debug模式:

    调用方式 第一次 第二次 第三次 第四次 第五次
    Generic Call 1.022425 1.012885 0.990775 1.020950 1.046880
    Reflection 147.489220 146.012010 142.690080 139.189335 141.663475
    dynamic 9.645850 9.979965 9.307235 9.532665 9.730030
    Func 1.201860 1.214800 1.170215 1.189280 1.239485
    Delegate 1.062215 1.061635 1.067510 1.047180 1.075190

    Release模式:

    调用方式 第一次 第二次 第三次 第四次 第五次
    Generic Call 0.745600 0.741365 0.722145 0.732630 0.725645
    Reflection 141.778260 142.855410 142.346095 139.649990 138.541285
    dynamic 9.631460 10.341850 9.284230 9.457580 9.060470
    Func 0.882100 0.852680 0.875695 0.854655 0.831670
    Delegate 0.710280 0.722465 0.723355 0.727175 0.693320

    点评结论:


    代码下载:浅谈反射优化
    您可能感兴趣的文章:
    • .net中 关于反射的详细介绍
    • asp.net 反射减少代码书写量
    • asp.net反射简单应用实例
    • .NET/C#利用反射调用含ref或out参数的方法示例代码
    • .NET/C#如何使用反射注册事件详解
    • .NET Core/Framework如何创建委托大幅度提高反射调用的性能详解
    上一篇:ASP.NET缓存介绍
    下一篇:asp.net 临时数据保存实现代码
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    浅谈.NET反射机制的性能优化 附实例下载 浅谈,.NET,反射,机制,的,