• 编写高质量代码改善程序的157个建议:使用Dynamic来简化反射的实现


       最近有时间看点书了,把157个建议在重新看一遍,代码都调试一遍。当我看到第15个建议的时候有些出入,就记录下来,欢迎大家来探讨。

       第十五条建议是,使用dynamic简化反射的使用,如果是针对这句话来讲,没问题,是正确的。dynamic的确可以简化反射的使用,但是从性能上来说是有条件的,可以根据自己情况选择。

       我按着书上的代码,原封不动的敲了一遍,如下

     1 class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             int times = 1;
     6             DynamicSample dynamicSample = new DynamicSample();
     7             var addMethod = typeof(DynamicSample).GetMethod("Add");
     8 
     9             Stopwatch watch1 = Stopwatch.StartNew();
    10             int result = 0;
    11             for (int i = 0; i < times; i++)
    12             {
    13                 result = (int)addMethod.Invoke(dynamicSample, new object[] { 1, 2 });
    14             }
    15             Console.WriteLine(string.Format("正常的反射耗时:{0}毫秒", watch1.ElapsedMilliseconds));
    16 
    17             Console.WriteLine("正常反射的结果:"+result);
    18 
    19             dynamic dynamicSample2 = new DynamicSample();
    20             int result2 = 0;
    21             Stopwatch watch2 = Stopwatch.StartNew();
    22             for (int i = 0; i < times; i++)
    23             {
    24                 result2 = dynamicSample2.Add(1, 2);
    25             }
    26             Console.WriteLine(string.Format("Dynamic的反射耗时:{0}毫秒", watch2.ElapsedMilliseconds));
    27 
    28             Console.WriteLine("Dynamic反射的结果:"+result2);
    29 
    30             DynamicSample reflectSamplebetter = new DynamicSample();
    31             var addMethod2 = typeof(DynamicSample).GetMethod("Add");
    32             var delg = (Func<DynamicSample, int, int, int>)Delegate.CreateDelegate(typeof(Func<DynamicSample, int, int, int>), addMethod2);
    33             int result3 = 0;
    34             Stopwatch watch3 = Stopwatch.StartNew();
    35             for (int i = 0; i < times; i++)
    36             {
    37                 result3=delg(reflectSamplebetter,1,2);
    38             }
    39             Console.WriteLine(string.Format("优化的反射耗时:{0}毫秒", watch3.ElapsedMilliseconds));
    40 
    41             Console.WriteLine("优化的反射结果:"+result3);
    42             Console.Read();
    43         }
    44     }

    对了,还有我们的测试实体类:

    public class DynamicSample
        {
            public string Name { get; set; }
    
            public int Add(int a, int b)
            {
                return a + b;
            }
        }

      我们都知道反射是有损性能的,无论是使用正常反射还是dynamic都是不好的,尽量不要使用,这是我的建议。

      如果非要用反射,就性能来讲,三者之间也是有选择的,不是说dynamic就是好的,如果就简化反射来说是好的,但是性能并不是那么好。

      我先测试一下:一次循环的结果如下

      很明显,正常的反射和优化后的反射要好,dynamic就差点了,在测试10000次循环:

    在一万次循环的情况下,优化后的反射依然那么给力,正常反射的性能也不错,dynamic就差很多了。

    我们再看看十万次循环怎么样?这次测试三次,看看每次的结果。

    100000次第一次测试结果:

    100000次第二次测试:

    100000次第三次测试:

    十万次测试,总体上来看,性能最好的还是优化后的反射,正常的反射要好一点,dynamic是最差的。

    最后测试一百万次循环,第一次测试结果:

    百万第二次,看看结果:

    总体上来看,百万循环,dynamic的好处才看到,性能也不错,又简化反射的使用,性能最好还是优化后翻身,大家明白了吧,不是任何时候dyanmic都是有用的。

    好了,就记录这么多吧,可能测试的不全面,希望大家包涵。

    选择条件是,反射能不用就不用,如果注重性能,优化后的反射使用方法是最好的,如果不是很复杂,用正常反射就可以,除非循环真的要那么多次,但是dynamic是真的可以简化反射使用,对性能是分条件的。

  • 相关阅读:
    javascript HTML DOM
    js 同步异步阻塞非阻塞非原创
    端口规范
    SASS用法指南
    整合js,css文件
    HTTP状态码大全
    控制移动端页面的缩放(meta)
    移动端最小以及最大的宽度
    H5手机端关注的问题
    javascript高级编程3第三章:基本概念 本章内容 语法 数据类型 流控制语句 函数
  • 原文地址:https://www.cnblogs.com/PatrickLiu/p/7016342.html
Copyright © 2020-2023  润新知