问题描述
我正在使用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
对象上使用ResumeTiming
和State
方法来暂停和恢复计时。但是,这可能会给时序循环带来一些开销。如果基准测试功能非常快,您可能会注意到它。
不,它对整个循环的多次迭代计时,而不是围绕单个语句甚至整个迭代插入计时器启动/停止。
计时也很昂贵,例如甚至在x86上的rdtsc
都需要约20个时钟周期,并且要从中获得有用的结果,就需要对无序执行进行序列化(例如,使用lfence
),这会破坏许多循环的性能,其中每次迭代都会独立工作。因此,单独计时短函数确实不是很可行或不现实。 Google Benchmark让您自己构建一个循环,以吞吐量(独立迭代)或延迟(将一个调用的输出输入到下一个迭代的输入中)为基准。
您您必须弄清楚如何创建要进行基准测试的整个循环。
在这种情况下,请使用价格便宜的PRNG,例如xorshift+。