【问题标题】:How can I tell Google Benchmark to not benchmark a line of code?如何告诉 Google Benchmark 不对某行代码进行基准测试?
【发布时间】:2020-10-26 20:28:01
【问题描述】:

我正在使用Google Benchmark 对库进行基准测试。我的基准设置如下:

for (auto _ : state) {
    run_function(first, last, v);
}

我想要v 在每次迭代中随机生成,这样我就可以获得一系列基准值并从中获取统计信息。我可以通过:

std::random_device rand_dev;
std::mt19937 generator(rand_dev());
std::uniform_int_distribution<int>  distr(min, max);
for (auto _ : state) {
    v = distr(generator)
    run_function(first, last, v);
}

我正在测试的一些函数在 10-100ns 的数量级上,因此添加生成器对结果有显着影响。有什么方法可以让 Google Bench 跳过一行/代码块?

【问题讨论】:

    标签: benchmarking google-benchmark


    【解决方案1】:

    您可以使用State 对象上的PauseTimingResumeTiming 方法来暂停和恢复计时。但是,它可能会给时序循环带来一些开销。如果 benchmark 下的函数非常快,你可能会注意到它。

    【讨论】:

      【解决方案2】:

      不,它对整个循环的多次迭代进行计时,而不是在单个语句甚至整个迭代周围插入计时器开始/停止。

      时间也很昂贵,例如甚至 x86 上的 rdtsc 也需要大约 20 个时钟周期,并且从中获得有用的结果需要序列化乱序执行(例如使用 lfence),这会破坏每次迭代都独立工作的多种循环的性能。因此,自己为短函数计时确实不太可行或不现实。 Google Benchmark 让您自己构建一个循环来对吞吐量(独立迭代)或延迟(将一个调用的输出提供给下一个迭代的输入)进行基准测试。

      必须弄清楚如何创建一个你想要进行基准测试的整个循环。

      在这种情况下,请使用非常便宜的 PRNG,例如 xorshift+

      【讨论】:

        猜你喜欢
        • 2014-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-25
        • 2013-03-10
        • 2011-01-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多