首页 > 代码库 > 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。因为所有的测试都是随机产生的,因此以上的时间均为平均时间。

参考代码:

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