C#怎么比較dynamic和Dictionary性能,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
公司主營(yíng)業(yè)務(wù):網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)公司推出葉集免費(fèi)做網(wǎng)站回饋大家。
開發(fā)中需要傳遞變參,考慮使用 dynamic 還是 Dictionary(準(zhǔn)確地說是Dictionary
首先使用以下測(cè)試代碼:
public void TestDynamic() { var e = CallDynamic(new { Value = 0 }); int v = e.Value; } public void TestDictionary() { var dict = new Dictionary(); dict["Value"] = 0; dict = CallDictionary(dict); int v = (int)dict["Value"]; } private dynamic CallDynamic(dynamic test) { int v = test.Value; v++; return new { Value = v }; } private Dictionary CallDictionary( Dictionary test) { int v = (int)test["Value"]; v++; var dict = new Dictionary (); dict["Value"] = v; return dict; }
分別比較運(yùn)行 1次、10次、100次、1000次、1e4次、1e5次、1e6次 時(shí)間
結(jié)果:
其中dynamic列和dynamic2列的數(shù)據(jù)分別是:
在一次運(yùn)行中執(zhí)行一步測(cè)試 和 在一次運(yùn)行中連續(xù)執(zhí)行所有測(cè)試
分析測(cè)試過程和數(shù)據(jù),得到以下結(jié)論:
1.dynamic***使用會(huì)產(chǎn)生一定的性能損耗
2.無(wú)論是否***使用,使用次數(shù)達(dá)到一定量級(jí),dynamic性能一定優(yōu)于Dictionary
3.一次運(yùn)行中連續(xù)使用dynamic會(huì)顯著拉低平均性能損耗
考慮到傳遞變參可能出現(xiàn)多個(gè)參數(shù),以上測(cè)試不完全。
使用以下代碼進(jìn)行第二階段實(shí)驗(yàn):
public void InvokeDynamic() { var e = CallDynamic2( new { Value1 = 0, Value2 = 0L, Value3 = 0f, Value4 = 0.0, Value5 = "test" }); int v1 = e.Value1; long v2 = e.Value2; float v3 = e.Value3; double v4 = e.Value4; string v5 = e.Value5; } public void InvokeDictionary() { var dict = new Dictionary(); dict["Value1"] = 0; dict["Value2"] = 0L; dict["Value3"] = 0f; dict["Value4"] = 0.0; dict["Value5"] = "test"; dict = CallDictionary2(dict); int v1 = (int)dict["Value1"]; long v2 = (long)dict["Value2"]; float v3 = (float)dict["Value3"]; double v4 = (double)dict["Value4"]; string v5 = (string)dict["Value5"]; } private dynamic CallDynamic2(dynamic test) { int v1 = test.Value1; long v2 = test.Value2; float v3 = test.Value3; double v4 = test.Value4; string v5 = test.Value5; v1++; v2++; v3++; v4++; v5 += "test"; return new { Value1 = v1, Value2 = v2, Value3 = v3, Value4 = v4, Value5 = v5 }; } private Dictionary CallDictionary2( Dictionary test) { int v1 = (int)test["Value1"]; long v2 = (long)test["Value2"]; float v3 = (float)test["Value3"]; double v4 = (double)test["Value4"]; string v5 = (string)test["Value5"]; v1++; v2++; v3++; v4++; v5 += "test"; var dict = new Dictionary (); dict["Value1"] = v1; dict["Value2"] = v2; dict["Value3"] = v3; dict["Value4"] = v4; dict["Value5"] = v5; return dict; }
結(jié)果數(shù)據(jù):
決定選擇使用dynamic
有兄弟考慮可能Box損耗了性能導(dǎo)致Dictionary表現(xiàn)不佳,
專門做了第三階段實(shí)驗(yàn),對(duì)比dynamic和Dictionary
具體數(shù)據(jù)不貼了,結(jié)果是dynamic在100000量級(jí)快一倍
看完上述內(nèi)容,你們掌握C#怎么比較dynamic和Dictionary性能的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!