最近有時間看點書了,把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是真的可以簡化反射使用,對性能是分條件的。