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

概述

  最近在看《编写高质量代码改善C#程序的157个建议》。看到第15个建议的时候,结合平时使用的习惯发现有部分出入,没有对不对的说法,只是使用习惯有点区别,跟随着我们来看一看。

  第15条建议是:使用dynamic简化反射的使用dynamic的确可以简化反射的使用,但是从性能上来说是有条件的,大家可以根据自己情况选择。

案例

  原书的案例如下:

static void Main(string[] args)
{
    int times = 1;
    DynamicSample dynamicSample = new DynamicSample();
    var addMethod = typeof(DynamicSample).GetMethod("Add");

    Stopwatch watch1 = Stopwatch.StartNew();
    int result = 0;
    for (int i = 0; i < times; i++)
    {
        result = (int)addMethod.Invoke(dynamicSample, new object[] { 1, 2 });
    }
    Console.WriteLine(string.Format("正常的反射耗时:{0}毫秒", watch1.ElapsedMilliseconds));
    Console.WriteLine("正常反射的结果:" + result);
    /****************************************************************************************************/

    dynamic dynamicSample2 = new DynamicSample();
    int result2 = 0;
    Stopwatch watch2 = Stopwatch.StartNew();
    for (int i = 0; i < times; i++)
    {
        result2 = dynamicSample2.Add(1, 2);
    }
    Console.WriteLine(string.Format("Dynamic的反射耗时:{0}毫秒", watch2.ElapsedMilliseconds));
    Console.WriteLine("Dynamic反射的结果:" + result2);
    /****************************************************************************************************/

    DynamicSample reflectSamplebetter = new DynamicSample();
    var addMethod2 = typeof(DynamicSample).GetMethod("Add");
    var delg = (Func<DynamicSample, int, int, int>)Delegate.CreateDelegate(typeof(Func<DynamicSample, int, int, int>), addMethod2);
    int result3 = 0;
    Stopwatch watch3 = Stopwatch.StartNew();
    for (int i = 0; i < times; i++)
    {
        result3 = delg(reflectSamplebetter, 1, 2);
    }
    Console.WriteLine(string.Format("优化的反射耗时:{0}毫秒", watch3.ElapsedMilliseconds));
    Console.WriteLine("优化的反射结果:" + result3);
    /****************************************************************************************************/

    Console.Read();
}
//测试实体类
public class DynamicSample
{
    public string Name { get; set; }
    public int Add(int a, int b)
    {
        return a + b;
    }
}

执行一次循环的结果如下:

很明显,正常的反射和优化后的反射要好,dynamic就差点意思了,我们继续测试。


 执行一万次循环的结果如下:

执行一万次循环,优化后的反射依然那么给力,正常反射的性能也不错,dynamic就差点意思了。


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

执行十万次第 1 次结果如下:

执行十万次第 2 次结果如下:

执行十万次第 3 次结果如下:

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


我们最后测试一下一百万次循环效果怎么样,这次测试两次,看看每次的结果。

执行一百万次第 1 次结果如下:

执行一百万次第 2 次结果如下:


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

总结

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

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

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

 

正文资料(157个建议目录一览表

编写高质量代码改善C#程序的157个建议:https://www.cnblogs.com/farmer-y/category/1122939.html

 

参考文献

 
 

喜欢就点赞加关注。

欢迎关注订阅微信公众号【熊泽有话说】,更多好玩易学知识等你来取
作者:熊泽-学习中的苦与乐
公众号:熊泽有话说

QQ群:711838388
出处:https://www.cnblogs.com/xiongze520/p/17577982.html
您可以随意转载、摘录,但请在文章内注明作者和原文链接。  

 

 

posted @ 2023-07-24 18:18  熊泽-学习中的苦与乐  阅读(1168)  评论(5编辑  收藏  举报