C++ std map unordered_map hash_map 的查找性能测试代码及结果

C++ std map unordered_map hash_map 的查找性能测试代码、过程及结果

测试环境

操作系统: 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 <iostream>
#include <map>
#include <hash_map>
#include <unordered_map>
#include <chrono>
namespace 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<std::chrono::microseconds>(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::map<int, int>                m;
    std::unordered_map<int, int>      um;
    std::hash_map<int, int>           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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值