问题标签 [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.

0 投票
0 回答
113 浏览

c++ - 正确有效地返回一个 Eigen::Matrix (带有惰性求值)

正如docs 中所解释的auto,在使用带有 eigen 的类型推导时应该注意。例如,以下函数对我来说是段错误,我可以接受:

据我了解上面的文档,我可以将返回类型拼写为实际矩阵(而不是惰性求值表达式)或使用eval().

在这个较长的示例中,我有两个我的实现MultiplyAdd,并将它们与 google-benchmark 进行比较。在一种情况下transform,我使用可以放入中央标题的方法进行操作,在另一种情况下,我在“调用站点”上进行所有低级数学运算。在示例中,我仅使用计算的第 2 行。它出现

all-at-call-site 版本的速度提高了约 20%(包含所有微基准测试的警告)。

鉴于上述链接,我的天真解释是我正在避免惰性评估并不必要地计算所有行。(速度差异似乎与我在 3 到 100 之间的选择无关DIMS,所以我怀疑我的解释是错误的。)

编写返回特征矩阵类型的函数的正确模式是什么(在文档中我只看到提到函数参数)?

编辑:我有一个新的例子,在观察上更接近我的真实案例

有三种方法可以进行我的计算:

  • 一个不调用的函数(counterExample被调用),因此让调用站点负责评估 - 尽管这可能(并且似乎)导致低效的多次评估counterExample_workereval
  • 调用并评估其表达式的函数(transform被调用) (可能不需要)classic_workereval
  • 呼叫现场的所有代码(由 完成allinline

用 g++8 编译并且-O3 -march=native(并且都在同一个翻译单元中,所以编译器可以做它想要的所有内联)我看到下面的时序表

看来,eval在这里不打电话是个坏主意。然而,在它自己的功能中进行转换也需要将所有内容写在一行中。所以问题是:有没有办法在不降低运行时减速的情况下将这里的转换放入单独的函数中?我确实注意到(不幸的是)此示例中的结果在很大程度上取决于编译器和编译标志(andg++-8 -msse3之间的差异消失了,似乎提供了更快的 with和 with ...)allinlineclassic_workerclang++-10allinline-msse3-march=native

0 投票
1 回答
526 浏览

c++ - 如何使用 libc++ 用 clang 编译 Google Benchmark

我想使用 libc++ 用 clang编译Google Benchmark文档中给出的示例:

我使用以下命令:

我得到了很多链接器错误:

完整输出可在此处获得(超过 1500 行)。如果我使用该-v选项,我可以看到:

我不知道问题是来自我的 clang 还是我的 Google Benchmark 安装。这是我为安装两者而制作的脚本:

在第二个 cmake 命令期间,我收到以下消息:

这是否意味着 Google Benchmark 不是使用 libc++ 构建的,我无法将它链接到我的基准测试?我该如何解决这个问题?


这是我的系统信息:

0 投票
0 回答
165 浏览

c++ - Finding percentile latency in Google Benchmark

I am trying to benchmark Intel TBB bounded concurrent queue enqueue using Google benchmark. What I understand is that Google benchmark runs for n number of iterations till the latency becomes stable and returns the average timings. I want to find percentile latency (99, 90, 50, 10). I searched but couldn't find anything that can help me do this. The closest thing I found was using a custom statistics function provided by the user. But that only works with repetitions (running iterations for n repetitions) and works on the average timings returned, i.e, if I run the test for n number of repetitions, average timings are returned for n repetitions and I can find percentiles from the average timings. I don't get all the latencies recorded in all the iterations. I get only the average timings for each repetition to find percentile.

Is there any way to calculate percentile latencies using google Benchmark ?

0 投票
2 回答
638 浏览

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

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

我想要的是v每次迭代都随机生成,这样我就可以获得一系列基准值并从中获取统计信息。我可以通过以下方式做到这一点:

我正在测试的一些功能在 10-100ns 的数量级上,因此添加生成器对结果有显着影响。有没有办法告诉 Google Bench 跳过一行/代码块?

0 投票
1 回答
86 浏览

google-benchmark - 我应该如何使用 Google 基准测试正确表示多变量复杂性?

谷歌微基准库支持估计算法的复杂性,但一切都是通过告诉框架你的大小来表达的N。我很好奇M+N在这个框架中表示算法的最佳方式是什么。在我的测试中,我在测试中检查了 M 和 N 值的笛卡尔积。

我是否SetComplexityN使用M+N(对于O(MN)我假设的算法SetComplexityN类似M*N)调用?如果我想对算法的复杂性进行硬编码(相对于最佳拟合),benchmark::oN那么会映射到M+Nbenchmark::oNSquared映射到O(MN)?

0 投票
1 回答
3769 浏览

c++ - 无法为小于 max_size 的大小创建大于 max_size() 的 std::vector

我正在运行谷歌基准测试以进行一些基本的缓存测试,但出现以下错误:

但是,我正在打印 max_size 和实际尺寸(见下文),而 max_size 等于 2^60-1,它在 2^28 处中断。我错过了什么?

基准代码如下。代码使用 Clang 11 和 c++20 编译。

0 投票
1 回答
590 浏览

c++ - 将 Google 基准与 cmake 关联

我尝试编译我的项目,包括google benchmark. 这是项目结构:

进入include我添加google benchmarksubmodule链接到最新版本@73d4d5e的文件夹中。相反,在benchmark文件夹中,我放置了这两个文件:

benchmark/first.cpp(它是存储库使用示例)

CMakeLists.txt

CMakeLists.txt项目根目录的文件中,我添加了编译标志:

-lbenchmark找不到标志。编译返回此错误:

ld: 找不到 -lbenchmark 的库

如果我省略标志,在编译期间我有这个输出:

架构 x86_64 的未定义符号:[build] "__ZN9benchmark10InitializeEPiPPc",引用自:[build] _main in first.cpp.o [build] "__ZN9benchmark22RunSpecifiedBenchmarksEv",引用自:[build] _main in first.cpp.o [build]" __ZN9benchmark27ReportUnrecognizedArgumentsEiPPc”,引用自:[build] _main in first.cpp.o [build]“__ZN9benchmark5State16StartKeepRunningEv”,引用自:[build] __ZL17BM_StringCreationRN9benchmark5StateE in first.cpp.o [build] __ZL13BM_StringCopyRN9benchmark5StateE in first.cpp.o [... ]

0 投票
0 回答
81 浏览

c++ - 相同的功能,不同的性能结果使用谷歌基准测试

我试图让自己熟悉 google 基准框架,并决定使用著名的前/后增量运行测试。但是,我发现在执行相同的函数时,实际上是相同的代码,在时间测量方面我得到了不同的结果。

我的测试包含三个功能:

  • incrementA,只是一个没有什么特别的for循环
  • incrementB这是一个副本incrementA
  • increment那叫incrementA

使用这三个函数,我编写了一个夹具,然后注册了测试。

编译:

结果不一致,例如通过交换测试的顺序,我得到不同的结果。

最初我认为缩放策略(powersave)可能会影响结果,但将其更改为性能后,结果是一样的。

仅供参考,我编译了谷歌框架(bf585a2 [v1.5.2]),我的库是:

我很确定编写相同的测试有不同的方法,欢迎阅读任何建议,但我的主要兴趣是知道我的代码有什么问题,以及为什么我得到不同的结果

0 投票
1 回答
92 浏览

c++ - Google Benchmark Ba​​seClass 初始化发生在静态变量分配导致问题之前

我想使用谷歌基准来运行我的代码,其中包含一个静态全局变量。在基准测试的基类中,我需要读取这个变量来执行一些设置。但是当初始化基准基类时,该静态变量尚未初始化并导致问题。

下面的最小复制示例包含三个文件test.htest.ccbenchmark_main.cc. benchmark_main.cc包含一个基准基类Init。它的构造函数读取data变量。但是此时,data变量仍然是空的。

问题:有没有办法让data变量初始化发生在基类初始化之前?也欢迎任何其他解决方法。

测试.h

测试.cc

基准_main.cc

0 投票
2 回答
368 浏览

c++ - 如何强制谷歌基准运行多次迭代?

我使用谷歌基准测试两个 C++ 函数。一个运行约 630,000,000 ns,一个运行约 1,000,000,000 ns。但两者都只运行一次迭代。如何强制基准运行更多迭代?我希望它至少运行 10 次。