C#使用Dynamic實(shí)現(xiàn)簡(jiǎn)化反射
最近有時(shí)間看點(diǎn)書了,把157個(gè)建議在重新看一遍,代碼都調(diào)試一遍。當(dāng)我看到第15個(gè)建議的時(shí)候有些出入,就記錄下來,歡迎大家來探討。
第十五條建議是,使用dynamic簡(jiǎn)化反射的使用,如果是針對(duì)這句話來講,沒問題,是正確的。dynamic的確可以簡(jiǎn)化反射的使用,但是從性能上來說是有條件的,可以根據(jù)自己情況選擇。
我按著書上的代碼,原封不動(dòng)的敲了一遍,如下:
class Program { static void Main(string[] args) { int times = 1; DynamicSample dynamicSample = new DynamicSample(); var addMethod = typeof(DynamicSample).GetMethod("Add"); Stopwatch watch1 = Stopwatch.StartNew(); int result = 0; for (int i = 0; i < times; i++) { result = (int)addMethod.Invoke(dynamicSample, new object[] { 1, 2 }); } Console.WriteLine(string.Format("正常的反射耗時(shí):{0}毫秒", watch1.ElapsedMilliseconds)); Console.WriteLine("正常反射的結(jié)果:"+result); dynamic dynamicSample2 = new DynamicSample(); int result2 = 0; Stopwatch watch2 = Stopwatch.StartNew(); for (int i = 0; i < times; i++) { result2 = dynamicSample2.Add(1, 2); } Console.WriteLine(string.Format("Dynamic的反射耗時(shí):{0}毫秒", watch2.ElapsedMilliseconds)); Console.WriteLine("Dynamic反射的結(jié)果:"+result2); DynamicSample reflectSamplebetter = new DynamicSample(); var addMethod2 = typeof(DynamicSample).GetMethod("Add"); var delg = (Func<DynamicSample, int, int, int>)Delegate.CreateDelegate(typeof(Func<DynamicSample, int, int, int>), addMethod2); int result3 = 0; Stopwatch watch3 = Stopwatch.StartNew(); for (int i = 0; i < times; i++) { result3=delg(reflectSamplebetter,1,2); } Console.WriteLine(string.Format("優(yōu)化的反射耗時(shí):{0}毫秒", watch3.ElapsedMilliseconds)); Console.WriteLine("優(yōu)化的反射結(jié)果:"+result3); Console.Read(); } }
對(duì)了,還有我們的測(cè)試實(shí)體類:
public class DynamicSample { public string Name { get; set; } public int Add(int a, int b) { return a + b; } }
我們都知道反射是有損性能的,無論是使用正常反射還是dynamic都是不好的,盡量不要使用,這是我的建議。
如果非要用反射,就性能來講,三者之間也是有選擇的,不是說dynamic就是好的,如果就簡(jiǎn)化反射來說是好的,但是性能并不是那么好。
我先測(cè)試一下:一次循環(huán)的結(jié)果如下
很明顯,正常的反射和優(yōu)化后的反射要好,dynamic就差點(diǎn)了,在測(cè)試10000次循環(huán):
在一萬次循環(huán)的情況下,優(yōu)化后的反射依然那么給力,正常反射的性能也不錯(cuò),dynamic就差很多了。
我們?cè)倏纯词f次循環(huán)怎么樣?這次測(cè)試三次,看看每次的結(jié)果。
100000次第一次測(cè)試結(jié)果:
100000次第二次測(cè)試:
100000次第三次測(cè)試:
十萬次測(cè)試,總體上來看,性能最好的還是優(yōu)化后的反射,正常的反射要好一點(diǎn),dynamic是最差的。
最后測(cè)試一百萬次循環(huán),第一次測(cè)試結(jié)果:
百萬第二次,看看結(jié)果:
總體上來看,百萬循環(huán),dynamic的好處才看到,性能也不錯(cuò),又簡(jiǎn)化反射的使用,性能最好還是優(yōu)化后翻身,大家明白了吧,不是任何時(shí)候dyanmic都是有用的。
好了,就記錄這么多吧,可能測(cè)試的不全面,希望大家包涵。
選擇條件是,反射能不用就不用,如果注重性能,優(yōu)化后的反射使用方法是最好的,如果不是很復(fù)雜,用正常反射就可以,除非循環(huán)真的要那么多次,但是dynamic是真的可以簡(jiǎn)化反射使用,對(duì)性能是分條件的。
到此這篇關(guān)于C#使用Dynamic實(shí)現(xiàn)簡(jiǎn)化反射的文章就介紹到這了,更多相關(guān)C# Dynamic簡(jiǎn)化反射內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#創(chuàng)建數(shù)據(jù)庫及導(dǎo)入sql腳本的方法
這篇文章主要介紹了C#創(chuàng)建數(shù)據(jù)庫及導(dǎo)入sql腳本的方法,涉及C#針對(duì)數(shù)據(jù)庫的創(chuàng)建、連接、導(dǎo)入等相關(guān)操作技巧,需要的朋友可以參考下2015-12-12C#使用偽隨機(jī)數(shù)實(shí)現(xiàn)加密用戶密碼的方法
這篇文章主要介紹了C#使用偽隨機(jī)數(shù)實(shí)現(xiàn)加密用戶密碼的方法,對(duì)于開發(fā)C#會(huì)員系統(tǒng)或者程序安全問題都有一定的參考借鑒價(jià)值,需要的朋友可以參考下2014-07-07C#創(chuàng)建安全的字典(Dictionary)存儲(chǔ)結(jié)構(gòu)
本文主要對(duì)存儲(chǔ)結(jié)構(gòu)字典(Dictionary)的一些常用方法進(jìn)行簡(jiǎn)單的說明,并闡述了如何創(chuàng)建安全的字典(Dictionary)存儲(chǔ)結(jié)構(gòu)。希望對(duì)大家有所幫助2016-12-12深入DropDownList用法的一些學(xué)習(xí)總結(jié)分析
本篇文章是對(duì)DropDownList的用法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06C#基于Socket實(shí)現(xiàn)簡(jiǎn)單聊天室功能
這篇文章主要為大家詳細(xì)介紹了C#基于Socket實(shí)現(xiàn)簡(jiǎn)單聊天室功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02Unity存儲(chǔ)游戲數(shù)據(jù)的多種方法小結(jié)
這篇文章主要介紹了Unity存儲(chǔ)游戲數(shù)據(jù)的幾種方法,在游戲開發(fā)中,存儲(chǔ)游戲數(shù)據(jù)是非常重要的,因?yàn)橛螒驍?shù)據(jù)決定了游戲的各個(gè)方面,例如游戲的進(jìn)度、玩家的成就、游戲的設(shè)置,需要的朋友可以參考下2023-02-02