最近有时间看点书了,把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就是好,其他的就不好。

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

平面设计培训,网页设计培训,美工培训,游戏开发,动画培训

明显正常的反射要好很多,在测试10000次循环:

平面设计培训,网页设计培训,美工培训,游戏开发,动画培训

 

在一万次循环的情况下,正常反射的性能要好很多。我们在看看十万次呢:

100000次第一次测试:

平面设计培训,网页设计培训,美工培训,游戏开发,动画培训

 

100000次第二次测试:

平面设计培训,网页设计培训,美工培训,游戏开发,动画培训

 

100000次第三次测试:

平面设计培训,网页设计培训,美工培训,游戏开发,动画培训

 

十万次测试,总体上来看,也是正常的反射要好很多。

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

平面设计培训,网页设计培训,美工培训,游戏开发,动画培训

 

百万第二次,看看结果:

平面设计培训,网页设计培训,美工培训,游戏开发,动画培训

 

总体上来看,百万循环,dynamic的好处才看到,大家明白了吧,不是任何时候dyanmic都是有用的。

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

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

天下国家,可均也;爵禄,可辞也;白刃,可蹈也;中庸不可能也

http://www.cnblogs.com/PatrickLiu/p/7016342.html