最近有時(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)的敲了一遍,如下:
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 }
對(duì)了,還有我們的測(cè)試實(shí)體類:
public class DynamicSample { public string Name { get; set; } public int Add(int a, int b) { return a + b; } }
我們都知道反射是有損性能的,無(wú)論是使用正常反射還是dynamic都是不好的,盡量不好使用,這是我的建議。
如果非要用反射,兩者之間也是有條件選擇的,不是dynamic就是好,其他的就不好。
我先測(cè)試循環(huán)一次的結(jié)果如下:
明顯正常的反射要好很多,在測(cè)試10000次循環(huán):
在一萬(wàn)次循環(huán)的情況下,正常反射的性能要好很多。我們?cè)诳纯词f(wàn)次呢:
100000次第一次測(cè)試:
100000次第二次測(cè)試:
100000次第三次測(cè)試:
十萬(wàn)次測(cè)試,總體上來(lái)看,也是正常的反射要好很多。
最后測(cè)試一百萬(wàn)次循環(huán),看看結(jié)果:
百萬(wàn)第二次,看看結(jié)果:
總體上來(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