CMap與hash_map效率對比
阿新 • • 發佈:2019-02-07
CMap與hash_map底層均採用hash stable實現,CMap是MFC提供的模板類。hash_map雖然目前並未納入C++標準模板類庫,但幾乎每個版本的STL都提供了相應的實現。CMap與hash_map的儲存於查詢效率比較如下:
利用rand函式隨機生成99999個整數構成查詢資料集,緊接著申請9999個整數作為查詢。測試兩個模板類的插入與查詢總時間,測試結果顯示:當查詢都不存在時CMap時間大約16ms,hash_map為0ms;當大部分查詢存在時CMap時間為624,而hash_map平均為5ms。當key為字串時,hash_map比CMap快,速度為CMap的近11倍。因為所有的測試都是隨機產生的,因此以上的時間均為平均時間。更正(該實驗沒有對cmap進行初始化,初始化為真實資料大小的130%之後cmap速度明顯提升,但是無法找到hash_map的初始化函式)
參考程式碼:
#include "stdafx.h" #include "afxtempl.h" #include <hash_map> #include <time.h> #include <iostream> using namespace std; #define DATASET 99999 #define QUERYNUM 9999 int _tmain(int argc, _TCHAR* argv[]) { srand((unsigned int)time(NULL)); CMap<int, int, int, int> cmap; hash_map<int, int> hmap; int tempnum[DATASET]; int query[QUERYNUM]; int exsit = 0; int j = 0; for (int i=0; i<DATASET; ++i) { // tempnum[i] = rand()%1000; tempnum[i] = rand(); } for (int i=0; i<QUERYNUM; ++i) { // query[i] = rand() + 1001; query[i] = rand(); } DWORD start; start = GetTickCount(); for (int i=0; i<DATASET; ++i) { cmap[tempnum[i]] = 1; } for (int i=0; i<QUERYNUM; ++i) { if (cmap.Lookup(query[i], j)) { exsit++; } } cmap.RemoveAll(); cout<<"Query Time"<<(double)(GetTickCount() - start)<<" :"<<exsit<<endl; exsit = 0; start = GetTickCount(); for (int i=0; i<DATASET; ++i) { hmap[tempnum[i]] = 1; } for (int i=0; i<QUERYNUM; ++i) { if (hmap.find(query[i]) != hmap.end()) { exsit++; } } hmap.clear(); cout<<"Query Time"<<(double)(GetTickCount() - start)<<" :"<<exsit<<endl; system("pause"); return 0; }