国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

[技術(shù)相關(guān)]List、Dictionary轉(zhuǎn)Dictionary的性能分析

2019-11-17 03:25:00
字體:
供稿:網(wǎng)友

[技術(shù)相關(guān)]List、Dictionary轉(zhuǎn)Dictionary的性能分析

1. 背景

  我們經(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日星期四

2. 結(jié)論

  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毫秒;

3. 環(huán)境

  1)開發(fā)環(huán)境采用VS2008,C#程序,手動編寫代碼實(shí)現(xiàn)。

  2)測試列表中包含100萬條數(shù)據(jù)。

4. 分析

4.1. 過程1:修改列表,是否對轉(zhuǎn)換造成異常

  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)容修改操作。

4.2. 過程2:列表轉(zhuǎn)換速度分析

  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 


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 雷山县| 洛扎县| 郑州市| 绵阳市| 庆云县| 余姚市| 漳浦县| 奉新县| 崇文区| 义乌市| 瑞安市| 富平县| 蒙自县| 新源县| 麻栗坡县| 大渡口区| 柞水县| 项城市| 织金县| 滕州市| 城口县| 涞水县| 缙云县| 疏附县| 怀化市| 共和县| 巴彦淖尔市| 平谷区| 桦南县| 浠水县| 那坡县| 射洪县| 宁乡县| 三亚市| 花垣县| 偏关县| 韶关市| 修水县| 奇台县| 南华县| 公安县|