我們經(jīng)常有對List和Dictionary列表進(jìn)行復(fù)制、轉(zhuǎn)換等操作,在數(shù)據(jù)量較少時(幾萬以內(nèi))各種轉(zhuǎn)換速度不會被覺察,但是數(shù)據(jù)量很大時(百萬左右),各種轉(zhuǎn)換方式的性能就會體現(xiàn)出來。
本文檔將對列表轉(zhuǎn)換效率進(jìn)行測試,最終得出效率較高的方法,指導(dǎo)今后軟件開發(fā)對技術(shù)的選擇。另外,本文還將對列表轉(zhuǎn)換過程中由另一線程修改列表數(shù)據(jù)時,是否會出現(xiàn)異常進(jìn)行確認(rèn)。
2013年5月16日星期四
1、在Dictionary轉(zhuǎn)Dictionary過程中由另一線程修改列表數(shù)據(jù)時,會出現(xiàn)異常。
2、采用Dictionary.ToDictionary()的方式速度很慢,100萬條需要249毫秒
3、采用Dictionary.Value.ToList的方式速度很快,100萬條數(shù)據(jù)僅32毫秒;
4、List.ToDictionary的方式速度需要109毫秒;
1)開發(fā)環(huán)境采用VS2008,C#程序,手動編寫代碼實(shí)現(xiàn)。
2)測試列表中包含100萬條數(shù)據(jù)。
1、方法:用兩個線程,一個線程負(fù)責(zé)Dictionary轉(zhuǎn)換,一個對列表進(jìn)行修改。
結(jié)果:系統(tǒng)報錯,確實(shí)會出現(xiàn)異常。
2、詳細(xì)說明(詳情參見下方源代碼)
用線程函數(shù)TH_DicTest0()進(jìn)行轉(zhuǎn)換操作,用線程函數(shù)TH_DicTest1()進(jìn)行列表內(nèi)容修改操作。
1、方法1:采用Dictionary.ToDictionary()的方式,
結(jié)果:16:44:08 標(biāo)識:[ToDic時間] 運(yùn)行時間為:249; 運(yùn)行次數(shù):1
2、方法2:采用Dictionary.Value.ToList,然后再List.ToDictionary的方式進(jìn)行轉(zhuǎn)換;
結(jié)果:
1)Dictionary.Value.ToList的方式用時:
16:44:08 標(biāo)識:[ToList時間] 運(yùn)行時間為:32; 運(yùn)行次數(shù):1
2)List.ToDictionary的方式用時:
16:44:08 標(biāo)識:[轉(zhuǎn)Dic時間] 運(yùn)行時間為:109; 運(yùn)行次數(shù):1

1 #region Dictionary測試 2 PRivate MainThread _tt0 = new MainThread(); 3 private MainThread _tt1 = new MainThread(); 4 private Dictionary<int, DataTestItem> _dicTest = new Dictionary<int, DataTestItem>(); 5 private Dictionary<int, DataTestItem> _dicTest1; 6 private void button17_Click(object sender, EventArgs e) 7 { 8 Init_DicTest(); 9 10 _tt0.Add(TH_DicTest0, 1);11 _tt1.Add(TH_DicTest1, 1);12 13 //_tt1.Start();14 _tt0.Start();15 }16 private void Init_DicTest()17 {18 DataTestItem item = null;19 for (int i = 0; i < 1000000; i++ )20 {21 item = new DataTestItem();22 item.a1 = i;23 item.a2 = i + 1;24 _dicTest.Add(item.a1, item);25 }26 }27 private List<DataTestItem> _lstTest = null;28 private void TH_DicTest0()29 {30 try31 {32 RunTimeScan.Instance().Begin("ToList時間");33 _dicTest1 = new Dictionary<int, DataTestItem>();34 _lstTest = _dicTest.Values.ToList();35 RunTimeScan.Instance().Stop("ToList時間");36 37 RunTimeScan.Instance().Begin("轉(zhuǎn)Dic時間");38 foreach (DataTestItem item in _lstTest)39 {40 _dicTest1.Add(item.a1, item);41 }42 RunTimeScan.Instance().Stop("轉(zhuǎn)Dic時間");43 44 RunTimeScan.Instance().Begin("ToDic時間");45 _dicTest1 = _dicTest.ToDictionary(p => p.Key, p => p.Value);46 RunTimeScan.Instance().Stop("ToDic時間");47 48 AddTView Code
新聞熱點(diǎn)
疑難解答