zoukankan      html  css  js  c++  java
  • 对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函数
     
     

     

     

    【注意】我是按照我对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,否则每字一元不讲价。】

     

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/fullsail/archive/2009/12/21/5045355.aspx

  • 相关阅读:
    C语言课程设计 学生信息管理系统 (简单版)
    Windows 常用Cmd命令行 (持续更新...)
    C++课程设计 通讯录管理系统 原码及解析
    C++ Error 个人笔记(live)
    sql查询当天数据
    web.xml中load-on-startup标签的含义
    @Repository、@Service、@Controller 和 @Component
    SQL Server JDBC驱动中sqljdbc和sqljdbc4区别
    windows下设置/删除Tomcat的开机自启动
    【Python技巧系列】条件语句一行实现
  • 原文地址:https://www.cnblogs.com/kex1n/p/1646855.html
Copyright © 2011-2022 走看看