編寫高質量代碼改善程序的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是真的可以簡化反射使用,對性能是分條件的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM