如何告诉Google Benchmark不对代码行进行基准测试?

问题描述

我正在使用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,v);
}

我正在测试的某些功能大约在10到100ns之间,因此添加生成器会对结果产生重大影响。有什么办法告诉Google Bench跳过一行代码/代码块吗?

解决方法

您可以在PauseTiming对象上使用ResumeTimingState方法来暂停和恢复计时。但是,这可能会给时序循环带来一些开销。如果基准测试功能非常快,您可能会注意到它。

,

不,它对整个循环的多次迭代计时,而不是围绕单个语句甚至整个迭代插入计时器启动/停止。

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

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...