C++stdmapunordered-创新互联

C++ std map unordered_map hash_map 的查找性能测试代码、过程及结果
  • 测试环境
  • 测试结果
  • 测试代码
  • 测试过程记录
    • 测试版本 RLEASE x64
    • 测试版本 Debug x64

创新互联建站-专业网站定制、快速模板网站建设、高性价比新华网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式新华网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖新华地区。费用合理售后完善,十年实体公司更值得信赖。测试环境

操作系统: Windows11专业版
硬件环境:Intel i5-12500 3GHz 、16GB
IDE:VS2019

测试结果

Release模式下:
查找效率:unordered_map ≈ hash_map >map
std::map 的效率远小于 unordered_map 和 hash_map

Debug模式下:

  1. 查找效率:hash_map >unordered_map >map
  2. 随着容量的增加,hash_map, unordered_map的查找效率有所降低,但浮动不大毕竟是常量级别。map的效率直线下降。。。

详细数据见本文下方的 测试过程记录

测试代码
#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS
#include#include#include#include#includenamespace test_perf
{class TimeCostCounter
{public:
    explicit TimeCostCounter(const std::string& msg)
    {msg_ = new char[msg.size() + 1];
        strncpy_s(msg_, (msg.size() + 1), msg.c_str(), msg.size());
        start_ = std::chrono::system_clock::time_point(std::chrono::system_clock::now());

#if 0
        char output[512] = {0 };
        _snprintf_s(output, sizeof(output) - 1,
            "enter time_const:%-7s microseconds  %s\r\n", "---", msg_);
        std::fprintf(stdout, "%s", output);
#endif // 0
    }
    ~TimeCostCounter()
    {std::chrono::system_clock::time_point time_end = std::chrono::system_clock::now();
        auto time_cust_t = std::chrono::duration_cast(time_end - start_);
        int cost_time = time_cust_t.count();

        char output[512] = {0 };
        _snprintf_s(output, sizeof(output) - 1,
            "exit  time_const:%-7d microseconds  %s\r\n", cost_time, msg_);
        std::fprintf(stdout, "%s", output);

        delete msg_;
    }
    
private:
    std::chrono::system_clock::time_point start_;
    char* msg_ = nullptr;
};


// 测试函数,
// size     :    map的实际大小
// times    :    查找的轮次,每一轮次都从0查找到size-1
void test(int size, int times)
{std::cout<< std::endl;
    std::cout<< "begin test, size:"<< size<< "  times:"<< times<< std::endl;

    std::mapm;
    std::unordered_map  um;
    std::hash_map   hm;

    // 初始化
    for (int i = 0; i< size; i++)
    {m[i] = i;
        um[i] = i;
        hm[i] = i;
    }

    int count_map = 0, count_unordered_map = 0, count_hash_map = 0;
    // map的查找
    {TimeCostCounter printer("test map");
        for (int i = 0; i< times; i++)
        {for (int j = 0; j< size; j++)
            {if (m.find(j) != m.end())
                {count_map++;
                }
            }
        }
        //std::cout<< "count:"<< count_map<< ", map:"<< std::endl;
    }


    // unordered_map的查找
    {TimeCostCounter printer("test unordered_map");
        for (int i = 0; i< times; i++)
        {for (int j = 0; j< size; j++)
            {if (um.find(j) != um.end())
                {count_unordered_map++;
                }
            }
        }
        //std::cout<< "count:"<< count_unordered_map<< ", unordered_map:"<< std::endl;
    }

    // hash_map的查找
    {TimeCostCounter printer("test hash_map");
        for (int i = 0; i< times; i++)
        {for (int j = 0; j< size; j++)
            {if (hm.find(j) != hm.end())
                {count_hash_map++;
                }
            }
        }
        //std::cout<< "count:"<< count_hash_map<< ", hash_map:"<< std::endl;
    }
    std::cout<< "count_map:"<< count_map<< "  count_unordered_map:"<< count_unordered_map<< "  count_hash_map:"<< count_hash_map<< std::endl;
}

int test_main()
{std::cout<< "test begin..."<< std::endl;

    test(10, 10000000);        // 容量:10         查找:1千万轮次
    test(100, 1000000);        // 容量:100        查找:1百万轮次
    test(1000, 100000);        // 容量:1000       查找:10万轮次
    test(10000, 10000);        // 容量:10000      查找:1万轮次
    test(100000, 1000);        // 容量:100000     查找:1000轮次
    test(1000000, 100);        // 容量:1000000    查找:100轮次
    test(10000000, 10);        // 容量:10000000   查找:10轮次

    std::cout<< "test finished"<< std::endl;

    return 0;
}
}  // namespace test_perf

int main()
{test_perf::test_main();

    int a = getchar();
    printf("a=%d", a);
    return 0;
}
测试过程记录 测试版本 RLEASE x64

第一次测试

test begin...

begin test, size:10  times:10000000
exit  time_const:377538  microseconds  test map
exit  time_const:185946  microseconds  test unordered_map
exit  time_const:231577  microseconds  test hash_map
count_map:100000000  count_unordered_map:100000000  count_hash_map:100000000

begin test, size:100  times:1000000
exit  time_const:680158  microseconds  test map
exit  time_const:174351  microseconds  test unordered_map
exit  time_const:219366  microseconds  test hash_map
count_map:100000000  count_unordered_map:100000000  count_hash_map:100000000

begin test, size:1000  times:100000
exit  time_const:2456112 microseconds  test map
exit  time_const:193982  microseconds  test unordered_map
exit  time_const:216137  microseconds  test hash_map
count_map:100000000  count_unordered_map:100000000  count_hash_map:100000000

begin test, size:10000  times:10000
exit  time_const:3935452 microseconds  test map
exit  time_const:262153  microseconds  test unordered_map
exit  time_const:246536  microseconds  test hash_map
count_map:100000000  count_unordered_map:100000000  count_hash_map:100000000

begin test, size:100000  times:1000
exit  time_const:3874978 microseconds  test map
exit  time_const:451669  microseconds  test unordered_map
exit  time_const:397784  microseconds  test hash_map
count_map:100000000  count_unordered_map:100000000  count_hash_map:100000000

begin test, size:1000000  times:100
exit  time_const:5637420 microseconds  test map
exit  time_const:2033308 microseconds  test unordered_map
exit  time_const:1697859 microseconds  test hash_map
count_map:100000000  count_unordered_map:100000000  count_hash_map:100000000

begin test, size:10000000  times:10
exit  time_const:5980635 microseconds  test map
exit  time_const:2049441 microseconds  test unordered_map
exit  time_const:2335847 microseconds  test hash_map
count_map:100000000  count_unordered_map:100000000  count_hash_map:100000000
test finished

第二次测试

test begin...

begin test, size:10  times:10000000
exit  time_const:387035  microseconds  test map
exit  time_const:194017  microseconds  test unordered_map
exit  time_const:219453  microseconds  test hash_map
count_map:100000000  count_unordered_map:100000000  count_hash_map:100000000

begin test, size:100  times:1000000
exit  time_const:658199  microseconds  test map
exit  time_const:178675  microseconds  test unordered_map
exit  time_const:219622  microseconds  test hash_map
count_map:100000000  count_unordered_map:100000000  count_hash_map:100000000

begin test, size:1000  times:100000
exit  time_const:2367859 microseconds  test map
exit  time_const:186760  microseconds  test unordered_map
exit  time_const:229742  microseconds  test hash_map
count_map:100000000  count_unordered_map:100000000  count_hash_map:100000000

begin test, size:10000  times:10000
exit  time_const:3969829 microseconds  test map
exit  time_const:258913  microseconds  test unordered_map
exit  time_const:254943  microseconds  test hash_map
count_map:100000000  count_unordered_map:100000000  count_hash_map:100000000

begin test, size:100000  times:1000
exit  time_const:3835890 microseconds  test map
exit  time_const:523620  microseconds  test unordered_map
exit  time_const:403951  microseconds  test hash_map
count_map:100000000  count_unordered_map:100000000  count_hash_map:100000000

begin test, size:1000000  times:100
exit  time_const:5635731 microseconds  test map
exit  time_const:2144435 microseconds  test unordered_map
exit  time_const:1756355 microseconds  test hash_map
count_map:100000000  count_unordered_map:100000000  count_hash_map:100000000

begin test, size:10000000  times:10
exit  time_const:6138499 microseconds  test map
exit  time_const:2386299 microseconds  test unordered_map
exit  time_const:2600038 microseconds  test hash_map
count_map:100000000  count_unordered_map:100000000  count_hash_map:100000000
test finished

第三次测试

test begin...

begin test, size:10  times:10000000
exit  time_const:383793  microseconds  test map
exit  time_const:179461  microseconds  test unordered_map
exit  time_const:246965  microseconds  test hash_map
count_map:100000000  count_unordered_map:100000000  count_hash_map:100000000

begin test, size:100  times:1000000
exit  time_const:696714  microseconds  test map
exit  time_const:184956  microseconds  test unordered_map
exit  time_const:240162  microseconds  test hash_map
count_map:100000000  count_unordered_map:100000000  count_hash_map:100000000

begin test, size:1000  times:100000
exit  time_const:2417398 microseconds  test map
exit  time_const:224808  microseconds  test unordered_map
exit  time_const:225643  microseconds  test hash_map
count_map:100000000  count_unordered_map:100000000  count_hash_map:100000000

begin test, size:10000  times:10000
exit  time_const:4034813 microseconds  test map
exit  time_const:265107  microseconds  test unordered_map
exit  time_const:235180  microseconds  test hash_map
count_map:100000000  count_unordered_map:100000000  count_hash_map:100000000

begin test, size:100000  times:1000
exit  time_const:3983721 microseconds  test map
exit  time_const:593352  microseconds  test unordered_map
exit  time_const:478527  microseconds  test hash_map
count_map:100000000  count_unordered_map:100000000  count_hash_map:100000000

begin test, size:1000000  times:100
exit  time_const:5755605 microseconds  test map
exit  time_const:2157740 microseconds  test unordered_map
exit  time_const:1781829 microseconds  test hash_map
count_map:100000000  count_unordered_map:100000000  count_hash_map:100000000

begin test, size:10000000  times:10
exit  time_const:6350555 microseconds  test map
exit  time_const:2214270 microseconds  test unordered_map
exit  time_const:2407366 microseconds  test hash_map
count_map:100000000  count_unordered_map:100000000  count_hash_map:100000000
test finished
测试版本 Debug x64

第一次测试

test begin...

begin test, size:10  times:10000000
exit  time_const:77725513 microseconds  test map
exit  time_const:55867924 microseconds  test unordered_map
exit  time_const:50301682 microseconds  test hash_map
count_map:100000000  count_unordered_map:100000000  count_hash_map:100000000

begin test, size:100  times:1000000
exit  time_const:103791587 microseconds  test map
exit  time_const:57031541 microseconds  test unordered_map
exit  time_const:53823537 microseconds  test hash_map
count_map:100000000  count_unordered_map:100000000  count_hash_map:100000000

begin test, size:1000  times:100000
exit  time_const:116249684 microseconds  test map
exit  time_const:55005075 microseconds  test unordered_map
exit  time_const:52733354 microseconds  test hash_map
count_map:100000000  count_unordered_map:100000000  count_hash_map:100000000

begin test, size:10000  times:10000
exit  time_const:141760952 microseconds  test map
exit  time_const:60648988 microseconds  test unordered_map
exit  time_const:54216907 microseconds  test hash_map
count_map:100000000  count_unordered_map:100000000  count_hash_map:100000000

begin test, size:100000  times:1000
exit  time_const:164759336 microseconds  test map
exit  time_const:75498544 microseconds  test unordered_map
exit  time_const:66905100 microseconds  test hash_map
count_map:100000000  count_unordered_map:100000000  count_hash_map:100000000

begin test, size:1000000  times:100
exit  time_const:195118169 microseconds  test map
exit  time_const:76603801 microseconds  test unordered_map
exit  time_const:70866936 microseconds  test hash_map
count_map:100000000  count_unordered_map:100000000  count_hash_map:100000000

begin test, size:10000000  times:10
exit  time_const:223320650 microseconds  test map
exit  time_const:77281447 microseconds  test unordered_map
exit  time_const:73711380 microseconds  test hash_map
count_map:100000000  count_unordered_map:100000000  count_hash_map:100000000
test finished

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


网页名称:C++stdmapunordered-创新互联
文章转载:http://azwzsj.com/article/psgeg.html