前言:程式中經常用到不定量陣列,選擇上可以使用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插入時間最短,遍歷時間最長