前言:程式中經常用到不定量陣列,選擇上可以使用CArray,CList,CMap,而這三者插入及遍歷的效率,未測試過,隨著資料量越來越大,需要做程式上的優化,於是比較下三種型別的插入盒遍歷的效率。
一、測試環境
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插入時間最短,遍歷時間最長