微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何告诉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+

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?