CArray CList CMap 插入与遍历效率对比
前言:程序中经常用到不定量数组,选择上可以使用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插入时间最短,遍历时间最长