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