最近有時(shí)間看點(diǎn)書了,把157個(gè)建議在重新看一遍,代碼都調(diào)試一遍。當(dāng)我看到第15個(gè)建議的時(shí)候有些出入,就記錄下來(lái),歡迎大家來(lái)探討。

   第十五條建議是,使用dynamic簡(jiǎn)化反射的使用,沒(méi)有說(shuō)明具體的條件。dynamic的確可以簡(jiǎn)化反射的使用,但是性能上并不是不分條件的。

   我按著書上的代碼,原封不動(dòng)的敲了一遍,如下

 

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開(kāi)發(fā),動(dòng)畫培訓(xùn)

 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("正常的反射耗時(shí):{0}毫秒", watch1.ElapsedMilliseconds));16 17             Console.WriteLine("正常反射的結(jié)果:"+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的反射耗時(shí):{0}毫秒", watch2.ElapsedMilliseconds));27 28             Console.WriteLine("Dynamic反射的結(jié)果:"+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("優(yōu)化的反射耗時(shí):{0}毫秒", watch3.ElapsedMilliseconds));40 41             Console.WriteLine("優(yōu)化的反射結(jié)果:"+result3);42             Console.Read();43         }44     }

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開(kāi)發(fā),動(dòng)畫培訓(xùn)

 

對(duì)了,還有我們的測(cè)試實(shí)體類:

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開(kāi)發(fā),動(dòng)畫培訓(xùn)

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

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開(kāi)發(fā),動(dòng)畫培訓(xùn)

 

  我們都知道反射是有損性能的,無(wú)論是使用正常反射還是dynamic都是不好的,盡量不好使用,這是我的建議。

如果非要用反射,兩者之間也是有條件選擇的,不是dynamic就是好,其他的就不好。

我先測(cè)試循環(huán)一次的結(jié)果如下:

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開(kāi)發(fā),動(dòng)畫培訓(xùn)

明顯正常的反射要好很多,在測(cè)試10000次循環(huán):

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開(kāi)發(fā),動(dòng)畫培訓(xùn)

 

在一萬(wàn)次循環(huán)的情況下,正常反射的性能要好很多。我們?cè)诳纯词f(wàn)次呢:

100000次第一次測(cè)試:

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開(kāi)發(fā),動(dòng)畫培訓(xùn)

 

100000次第二次測(cè)試:

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開(kāi)發(fā),動(dòng)畫培訓(xùn)

 

100000次第三次測(cè)試:

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開(kāi)發(fā),動(dòng)畫培訓(xùn)

 

十萬(wàn)次測(cè)試,總體上來(lái)看,也是正常的反射要好很多。

最后測(cè)試一百萬(wàn)次循環(huán),看看結(jié)果:

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開(kāi)發(fā),動(dòng)畫培訓(xùn)

 

百萬(wàn)第二次,看看結(jié)果:

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開(kāi)發(fā),動(dòng)畫培訓(xùn)

 

總體上來(lái)看,百萬(wàn)循環(huán),dynamic的好處才看到,大家明白了吧,不是任何時(shí)候dyanmic都是有用的。

好了,就記錄這么多吧,可能測(cè)試的不全面,希望大家包涵。

選擇條件是,反射能不用就不用,如果不是很復(fù)雜,用正常反射就可以,除非循環(huán)真的要那么多次,但是dynamic是真的可以簡(jiǎn)化反射使用,對(duì)性能是分條件的。

天下國(guó)家,可均也;爵祿,可辭也;白刃,可蹈也;中庸不可能也

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