加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 01:18:37 所属栏目:百科 来源:网络整理
导读:?? 最近有时间看点书了,把157个建议在重新看一遍,代码都调试一遍。当我看到第15个建议的时候有些出入,就记录下来,欢迎大家来探讨。 ?? 第十五条建议是,使用dynamic简化反射的使用,如果是针对这句话来讲,没问题,是正确的。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 = 011             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 = 20             int result2 = 21             Stopwatch watch2 =22             23 24                 result2 = dynamicSample2.Add(25 26             Console.WriteLine(Dynamic的反射耗时:{0}毫秒27 
28             Console.WriteLine(Dynamic反射的结果:result2);
29 
30             DynamicSample reflectSamplebetter = 31             var addMethod2 = 32             var delg = (Func<DynamicSample,1)">int,1)">int>)Delegate.CreateDelegate(typeof(Func<DynamicSample,1)">int>),addMethod2);
33             int result3 = 34             Stopwatch watch3 =35             36 37                 result3=delg(reflectSamplebetter,1)">38 39             Console.WriteLine(优化的反射耗时:{0}毫秒40 
41             Console.WriteLine(优化的反射结果:result3);
42             Console.Read();
43         }
44     }

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

public  DynamicSample
    {
        string Name { get; set; }

        int Add(int a,1)">int b)
        {
            return a + b;
        }
    }

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

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

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

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

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

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

100000次第一次测试结果:

100000次第二次测试:

100000次第三次测试:

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

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

百万第二次,看看结果:

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读