问题标签 [google-benchmark]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 正确获取 std::valarray 到(google/quick)工作台
我正在尝试比较使用 Google Benchstd::valarray
与std::vector
/操作的性能。std::transform
我正在使用 QuickBench。
我的代码(用于 QuickBench)是
QuickBench 链接
Quickbench 说std::valarray
是 72 倍那么快std::vector
。那不可能是对的,对吧?我究竟做错了什么?
c++ - 谷歌基准框架不优化
我void DoNotOptimize
对 Google Benchmark Framework 的功能实现有点困惑(定义来自这里):
所以它实现了变量,如果是非常量,还告诉编译器忘记它之前的值。("+r"
是一个 RMW 操作数)。
并且总是使用一个clobber,它是一个防止重新排序加载/存储的编译器"memory"
屏障,即确保所有全局可访问对象的内存与C++抽象机同步,并假设它们也可能已被修改。
我远不是低级代码专家,但据我了解实现,该函数用作读/写障碍。所以 - 基本上 - 它确保传入的值要么在寄存器中,要么在内存中。
虽然如果我想保留函数的结果(应该进行基准测试),这似乎是完全合理的,但我对留给编译器的自由度感到有点惊讶。
我对给定代码的理解是,编译器可能会在每次调用时插入一个具体化点DoNotOptimize
,这意味着在重复执行时(例如,在循环中)会产生大量开销。当不应该优化的值只是单个标量值时,如果编译器确保该值驻留在寄存器中似乎就足够了。
区分指针和非指针不是一个好主意,例如:
multithreading - 在谷歌基准测试中对已经多线程的函数进行基准测试时如何暂停计时器?
GitHub 上的文档有一个关于多线程基准测试的部分,但是,它需要将多线程代码放在基准测试定义中,并且库本身会使用多个线程调用此代码。
我想对一个在内部创建线程的函数进行基准测试。我只对优化多线程部分感兴趣,所以我想单独对该部分进行基准测试。因此,我想在函数的顺序代码运行或内部线程正在创建/销毁并进行设置/拆卸时暂停计时器。
c++ - 如何在 Quick Bench 中开启多线程?
不确定这是否是这个问题的正确标签。如果不是,请建议哪个是正确的。
请参阅此处运行的此 QuickBench 示例,其中在需要多线程时没有输出。
https://quick-bench.com/q/XW3X12SejvDrZnqcKDQsiN5SoPI
Guess QuickBench 不支持多线程,因此当基准测试请求多线程时没有输出。
c++ - Google Benchmark:相同的功能,不同的数据
我最近一直在玩谷歌基准框架,我想测量函数在具有不同统计属性的数据上花费的时间。
为简洁起见,让我们考虑一个最简单的例子:计算向量中奇数元素的总和:
尽管函数非常简单,但我限制它只运行 10 次迭代,因为我实际想要分析的函数成本很高(每次迭代大约 10 秒)。
因为迭代次数不够大,我遇到了不同的时间和不同的基准测试顺序:
尽管真正的函数做了很多工作,但我在基准测试中观察到了类似的行为。
我怀疑问题出在分支预测中,所以我对此有一些疑问:
- 当运行多次迭代时,测量的时间更稳定,但当分支预测还没有那么好时,我们实际上并没有测量“冷启动”。这不是谷歌基准测试的用途吗?
- 假设运行大量迭代是不可行的,如何处理上述情况?我们是否运行多个可执行文件?如果我想对两个向量进行不同的基准测试,我该怎么办
kN
?对于不同的统计分布,我们是否有两个可执行文件,或者对于数据分布和大小的每种组合,我们是否有很多可执行文件? - 我看到很多人说“微基准测试很难”,因为分支预测器总是随着迭代次数而提高。例如,这是一篇博客文章,展示了分支预测器不会随着迭代次数而停止改进。它最终确实进展甚微,但无论如何,我们如何衡量这一点,因为它总是在变得更好?
感谢您的时间,期待任何答复:)
c++ - Google Benchmark 库会多次调用测试块吗?
我有这个 Google Benchmark 使用的最小示例。奇怪的是“42”被打印了很多次(4),而不仅仅是一次。我知道图书馆必须多次运行才能获得统计信息,但我认为这是由 statie-loop 本身处理的。
这是一个更复杂的事情的最小示例,我想打印(在循环外)结果以验证同一函数的不同实现是否会给出相同的结果。
输出:(42
打印4次,为什么不止一次,为什么4?)
我还能如何测试(至少在视觉上)不同的基准测试块给出相同的答案?
c++ - 谷歌基准排序算法
我想使用 Google Benchmark 对各种排序算法进行基准测试。如果我使用
大多数情况下,我最终都会对预先排序的向量进行排序。我在手册中读到我可以使用手动计时来仅对我关心的部分进行基准测试:
这是使用 Google Benchmark 对排序算法进行基准测试的正确方法吗?有更好的方法吗?
benchmarking - Google 的 `DoNotOptimize()` 函数如何强制语句排序
我试图确切地了解谷歌DoNotOptimize()
应该如何工作。
为了完整起见,这里是它的定义(对于clang和非常量数据):
据我了解,我们可以在这样的代码中使用它:
为了确保基准保持在关键部分:
具体来说,我不明白的是为什么这保证(是吗?)run_bench()
没有移到上面start_time = time()
。
(有人在此评论中确切地问了这个问题,但是我不明白答案)。
据我了解,上面DoNotOptimze()
做了几件事:
- 它强制
value
堆栈,因为它是通过 C++ 引用传递的。你不能有一个指向寄存器的指针,所以它必须在内存中。 - 因为
value
现在在堆栈上,所以随后破坏内存(如在 asm 约束中所做的那样)将强制编译器假定value
调用DoNotOptimize(value)
. - (我不清楚
+r,m
约束是否相关。据我所知,这表明指针本身可能存储在寄存器或内存中,但指针值本身可能被读取和/或写入。)
这就是我变得模糊的地方。
如果start_time
还分配了堆栈,则内存破坏DoNotOptimize()
将意味着编译器必须假定DoNotOptimize()
可能读取start_time
. 因此语句的顺序只能是:
但是如果start_time
不存储在内存中,而是存储在寄存器中,那么破坏内存不会破坏start_time
,对吧?在这种情况下,所需的start_time = time()
and顺序DoNotOptimize(bench_inputs)
会丢失,编译器可以自由地执行以下操作:
显然我误解了一些东西。谁能帮忙解释一下?谢谢 :)
我想知道这是否是因为重新排序优化发生在寄存器分配之前,因此所有东西都被认为是当时堆栈分配的。但如果是这样的话,那DoNotOptimize()
将是多余的,ClobberMemory()
就足够了。
c++ - C++ - 使用库设置谷歌基准输出文件和路径
我编写了这个基准框架,它现在没有使用该google benchmark
库:
我现在可以使用CLI
它来选择JSON
ant 中的格式,我可以使用环境变量将提示修复到我的CMakeLists.txt
使用环境变量中,对于显示输出文件BENCHMARK_FORMAT
也可以做同样的事情。BENCHMARK_OUT
是否可以使用库通过代码设置输出文件及其路径?