对Visual Studio C++ hash_map严谨一点的测试
来源:互联网 发布:arp专杀软件 编辑:程序博客网 时间:2024/06/06 03:42
对Visual Studio C++ hash_map严谨一点的测试
在上次测试完成后,有一个网友mm304321141 (明儿)在留言上对测试数据进行了质疑,先谢谢他的指正。 我的确不知道Visual Studio C++ 默认的Dinkumware STL hash_map的hash_compase有两个参数bucket_size 和min_buckets ,我自己实现的时候类是从stdext::hash_compare继承的,忽视了这两个参数,而上次测试的时候更是使用了默认模板参数。
玩benchmark测试的人,最怕人说不严谨,虽然我私人的测试环境很难服众,但这次的测试也尽量认真一点。
测试环境:私人的机器,Genuine,1.6G双核 2G内存
测试的编译器:MSVC 2005,(上次用的2003)
测试代码如下:
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <map>
#include <hash_map>
#include <algorithm>
#include <ace/OS.h>
#include <ace/Time_Value.h>
const size_t TEST_NUMBER = 200000;
const size_t INIT_BUCKETS_NUMBER = 262144;
class test_hash_compare
{
public:
//注意这个地方,我重新定义了这2个参数,【注意】
static const size_t bucket_size = 4;
static const size_t min_buckets = INIT_BUCKETS_NUMBER;
//static const size_t min_buckets = 8;
test_hash_compare()
{
}
size_t operator( )( const size_t& Key ) const
{
return Key;
}
bool operator( )(
const size_t& _Key1,
const size_t& _Key2
) const
{
return (_Key1<_Key2)?true:false;
}
};
void test_hash_map()
{
ACE_Time_Value tvStart(0);
ACE_Time_Value tvEnd(0);
ACE_Time_Value tvPassTime(0);
tvStart = ACE_OS::gettimeofday();
//这是使用STLPORT后才有的宏
#if defined _STLPORT_VERSION
std::hash_map<size_t,int> int_hash_map;
//注意这行代码,VS.NET默认的STL没有这个函数的,而STLPort的实现有这个函数
int_hash_map.resize(INIT_BUCKETS_NUMBER);
#else
stdext::hash_map<size_t,int,test_hash_compare> int_hash_map;
#endif //
//测试20万次
//顺序插入一组数据
for (size_t i= 0;i<TEST_NUMBER;++i)
{
int_hash_map[i]=0;
}
//查询40万次,一半能查询到,一半不能查询到
for (size_t i= 0;i<2*TEST_NUMBER;++i)
{
int_hash_map.find(i);
}
//得到毫秒的时间差
tvEnd = ACE_OS::gettimeofday();
tvPassTime = tvEnd - tvStart;
std::cout<<"test_hash_map gettimeofday :"<<tvPassTime.msec()<<" "<<std::endl;
};
int main(int argc, char* argv[])
{
for (int j=0;j<5;++j)
{
test_hash_map();
}
_getch();
return 0;
}
上次使用debug版本一方面是为了拍麻烦,另一方面觉得自己的代码简单,担心某些优化导致结果的不公。这次我采用了Release 版本进行比较,最后测试结果如下:
表1 对hash_map在几种环境下进行测试
测试方式
STLPort版本的hash_map不使用resize函数
(耗时ms)
STLPort版本的hash_map测试前使用resize函数
(耗时ms)
微软MSVC2005默认STL的hash_map,使用自定义的hash_compare函数
微软MSVC2005默认STL的hash_map,使用默认的hash_compare函数
第1次
62
46
593
718【注】
第2次
62
31
625
2000
第3次
62
46
625
2000
第4次
46
46
625
2000
第5次
46
46
625
1984
DEBUG版本测试的数据就不在这儿列出了【注】,和上面的数据差不多。
【注意】我是按照我对MSDN里面对bucket_size,min_buckets的说明进行的定义,我对bucket_size也进行了一些调整,没有发现有什么特别的优化空间,如果调整的更大,反而会影响降低速度。
【注意】为什么第一次会快很多,我有点疑惑,先以为是感染数据,但是多次测试发现实际第一次的确要快不少,有点怀疑是页面交换错误导致的。
【注意】使用debug版本测试的时候发现每次函数执行的事件并算特别长,但是我的等待事件却出人意料的久远,稍稍看了测试代码,估计是MSVC的DEBUG版本的内存检查导致的问题。
测试的结果,MSVC的结果并没有更加争气,稍稍考虑一下,我的测试的确比较偏向STLPort,它的小对象分配器在我的测试中间可能大占便宜。当然这也是STLPort(SGI STL)设计的好的地方。
最后说一句,对于MSVC的这个实现,我仍然报以无奈,或者说其不上流,即使在hash_compare中间优化bucket_size,min_buckets,可以提高速度。但如果要依靠这样的方式初始化,对于很多实现开发者要重新实现hash_compare才能得以实现性能最优。
还是那个老建议,如果可能,可以考虑使用STLPort的实现,当然这样你可能要付出很多代价,(几乎要重新编译所有的库)
最后仍然对mm304321141 (明儿)表示感谢!
【本文作者是fullsail(雁渡寒潭),本着自由的精神,你可以在无盈利的情况完整转载此文档,转载时请附上BLOG链接:http://blog.csdn.net/fullsail,否则每字一元不讲价。】
- 对Visual Studio C++ hash_map严谨一点的测试
- 对Visual Studio C++ hash_map严谨一点的测试
- 对Visual Studio C++ hash_map严谨一点的测试
- 慎用Visual Studio C++默认的hash_map
- 慎用Visual Studio C++默认的hash_map
- 对map和hash_map的一点总结
- visual studio 2015对C/C++标准的支持情况
- 【C#】对Visual Studio使用的初步认识
- Visual Studio 2005 的一点用法技巧
- 对测试的一点思考
- 【C++】STL的hash_map
- 对C的一点感慨
- Visual Studio 2010:测试驱动的开发
- 对性能测试的一点想法
- 对测试题的一点建议
- 对自动化测试的一点思考
- 对软件测试教育的一点思考
- (视频)Erich Gamma 与 Visual Studio Online 的一点野史
- 高兴点,别郁闷~
- tomcat6.0.2 cas spring security配置开发
- 信息化项目要学会向上要支持
- 好玩的做图片网站
- 十五种途径告诉你什么不是云计算
- 对Visual Studio C++ hash_map严谨一点的测试
- c++入门
- 手机常识1,2,3 适合老年用的手机
- ...........
- mysql命令
- linux 2.6源代码情景分析笔记之内存2
- 让你的创业失败的18个昏招
- 让创业者惊讶的19个真相
- 邵亦波:企业失败最可能原因是创始人争斗