1. 程式人生 > >CMap與hash_map效率對比

CMap與hash_map效率對比

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;
}