V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
csfreshman
V2EX  ›  程序员

请教大家关于 google benchmark 的一个问题

  •  
  •   csfreshman · 2021-08-14 00:09:26 +08:00 · 1384 次点击
    这是一个创建于 977 天前的主题,其中的信息可能已经有所发展或是发生改变。

    晚上在虚拟机上安装了 google benchmark 运行了一个网上的例子,运行 ok,自己写了一个始终显示都是 0ns 耗时,请求各位大佬分析,哪里有问题?

    #include <benchmark/benchmark.h>
    #include <vector>
    
    int loop = 100000;
    static void bench_vector_reserve(benchmark::State& state)
    {
        std::vector<int> ans;
        ans.reserve(loop);
        for(int i = 0;i < loop;i++)
            ans.push_back(i);
    }
    BENCHMARK(bench_vector_reserve);
    
    static void bench_vector(benchmark::State& state)
    {
        std::vector<int> ans;
        for(int i = 0;i < loop;i++)
            ans.push_back(i);
    }
    BENCHMARK(bench_vector);
    
    BENCHMARK_MAIN();
    
    

    最近学习 C++了解到 vector 会动态扩容,比如每次空间 double,我上面的例子不管 loop 调多大,运行结果都显示:

    [root workspace]#./a.out
    2021-08-13T12:00:19-04:00
    Running ./a.out
    Run on (4 X 1900 MHz CPU s)
    CPU Caches:
      L1 Data 32 KiB (x2)
      L1 Instruction 32 KiB (x2)
      L2 Unified 256 KiB (x2)
      L3 Unified 3072 KiB (x1)
    Load Average: 0.02, 0.03, 0.00
    ---------------------------------------------------------------
    Benchmark                     Time             CPU   Iterations
    ---------------------------------------------------------------
    bench_vector_reserve      0.000 ns        0.000 ns            0
    bench_vector              0.000 ns        0.000 ns            0
    [root workspace]#
    

    有没有帮忙老哥分析一波?

    4 条回复    2021-08-15 16:29:15 +08:00
    csfreshman
        1
    csfreshman  
    OP
       2021-08-14 00:18:01 +08:00
    求各位大佬分析一波,我顶不住了先休息了😝
    BiteTheDust
        2
    BiteTheDust  
       2021-08-14 00:57:30 +08:00
    你没看官网文档示例吗,得把你测试的内容放在循环体里。
    ```
    static void BM_StringCreation(benchmark::State& state) {
    for (auto _ : state)
    std::string empty_string;
    }
    ```
    ```
    static void bench_vector_reserve(benchmark::State& state)
    {
    for (auto _ : state)
    {
    std::vector<int> ans;
    ans.reserve(loop);
    for(int i = 0;i < loop;i++)
    ans.push_back(i);
    }
    }
    ```
    c0xt30a
        3
    c0xt30a  
       2021-08-14 03:50:37 +08:00
    看起来是被优化掉了
    csfreshman
        4
    csfreshman  
    OP
       2021-08-15 16:29:15 +08:00
    @BiteTheDust 多谢,看了源代码的例子,按照你说的这种写法确实能跑起来,感谢老铁
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1091 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 22:49 · PVG 06:49 · LAX 15:49 · JFK 18:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.