CArray CList CMap 插入与遍历效率对比
生活随笔
收集整理的這篇文章主要介紹了
CArray CList CMap 插入与遍历效率对比
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前言:程序中經常用到不定量數組,選擇上可以使用CArray,CList,CMap,而這三者插入及遍歷的效率,未測試過,隨著數據量越來越大,需要做程序上的優化,于是比較下三種類型的插入盒遍歷的效率。
一、測試環境
購物優惠券 https://m.cqfenfa.com/?1、測試使用的筆記本的配置。
?
?
? 2 系統版本:
?
?
?二、測試數據
? ?自定義結構體,包含12個float的數據,準備插入1000000個數據
struct LXYDATA { float L; float x; float y; float Tc; float X; float Y; float Z; float u; float v; float L1; float a; float b; };?
三 CArray測試
1 變量定義
? ?
CArray<LXYDATA,LXYDATA&> arrayData;?
2 未事先指定元素個數時測試代碼
LXYDATA data; DWORD timeStart; DWORD timeEnd; CString strTemp;data.L = 45.22; data.x = 45.22; data.y = 45.22; data.Tc = 45.22; data.X = 45.22; data.Y = 45.22; data.Z = 45.22; data.u = 45.22; data.v = 45.22; data.L1 = 45.22; data.a = 45.22; data.b = 45.22;timeStart = GetTickCount(); arrayData.RemoveAll();for (int i = 0; i < 10000000; i ++) { arrayData.Add(data); } timeEnd = GetTickCount(); strTemp.Format("%d",timeEnd-timeStart); AfxMessageBox(strTemp);3 測試時間
? 1 未指定大小的情況下,程序跑了935828ms,未出結果,內存一度上升到800+M
?
?
?
?
? 2 插入前指定大小 測試時間
timeStart = GetTickCount();arrayData.RemoveAll();arrayData.SetSize(10000000,10000000);for (int i = 0; i < 10000000; i ++){arrayData.Add(data);}timeEnd = GetTickCount();strTemp.Format("%d",timeEnd-timeStart);AfxMessageBox(strTemp);?
?
3 遍歷時間
LXYDATA dataTemp;CString strTemp;DWORD timeStart,timeEnd;timeStart = GetTickCount();for (int i = 0; i < 1000000; i ++){dataTemp = arrayData.GetAt(i);}timeEnd = GetTickCount();strTemp.Format("%d",timeEnd-timeStart);AfxMessageBox(strTemp);?
?
四 CList測試
1 變量定義
CList<LXYDATA,LXYDATA&> listData;2 插入代碼
LXYDATA data;DWORD timeStart;DWORD timeEnd;CString strTemp;data.L = 45.22;data.x = 45.22;data.y = 45.22;data.Tc = 45.22;data.X = 45.22;data.Y = 45.22;data.Z = 45.22;data.u = 45.22;data.v = 45.22;data.L1 = 45.22;data.a = 45.22;data.b = 45.22;timeStart = GetTickCount();listData.RemoveAll();for (int i = 0; i < 10000000; i ++){listData.AddTail(data);}timeEnd = GetTickCount();strTemp.Format("%d",timeEnd-timeStart);AfxMessageBox(strTemp);3 插入時間
?
4 遍歷時間
LXYDATA dataTemp;CString strTemp;DWORD timeStart,timeEnd;timeStart = GetTickCount();// GetAt方式遍歷時間過長 // for (int i = 0; i < 1000000; i ++) // { // dataTemp = listData.GetAt(listData.FindIndex(i)); // } POSITION pos = listData.GetHeadPosition();while(pos != NULL){dataTemp = listData.GetNext(pos);}timeEnd = GetTickCount();strTemp.Format("%d",timeEnd-timeStart);AfxMessageBox(strTemp);?
?
五 CMap時間測試
1 變量定義
CMap<int,int,LXYDATA,LXYDATA> mapData;2 插入代碼
LXYDATA data;DWORD timeStart;DWORD timeEnd;CString strTemp;data.L = 45.22;data.x = 45.22;data.y = 45.22;data.Tc = 45.22;data.X = 45.22;data.Y = 45.22;data.Z = 45.22;data.u = 45.22;data.v = 45.22;data.L1 = 45.22;data.a = 45.22;data.b = 45.22;timeStart = GetTickCount();mapData.RemoveAll(); mapData.InitHashTable(1200001); //一定要指定大小,大小設置實際使用到的1.2倍,且使用奇數for (int i = 0; i < 1000000; i ++){mapData.SetAt(i,data);}timeEnd = GetTickCount();strTemp.Format("%d",timeEnd-timeStart);AfxMessageBox(strTemp);3 插入時間
?
?
4 查詢時間
LXYDATA dataTemp;CString strTemp;DWORD timeStart,timeEnd;timeStart = GetTickCount();POSITION pos = mapData.GetStartPosition();int i = 0;while(pos != NULL){mapData.GetNextAssoc(pos,i,dataTemp);}timeEnd = GetTickCount();strTemp.Format("%d",timeEnd-timeStart);AfxMessageBox(strTemp);?
?
?
六 總結
1 不管用哪一種方式,如果數據量較大,都要在使用前指定大小,這個效率是非一般的提升
2 CArray的遍歷時間最短,只是相對較短,其他兩個也沒有太耗時間,可以算是基本持平
3 CMap插入時間最短,遍歷時間最長
?
總結
以上是生活随笔為你收集整理的CArray CList CMap 插入与遍历效率对比的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 刚放假 就随便写点 什么 写一下怎
- 下一篇: Java中的基本数据类型和引用数据类型