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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值