日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CArray CList CMap 插入与遍历效率对比

發布時間:2023/12/31 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 插入与遍历效率对比的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。