问题标签 [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 投票
1 回答
470 浏览

c++ - 谷歌基准测试:断言“has_range_x_”失败

在一个项目中,我开始使用来自https://github.com/google/benchmark.git tag v1.0.0 的 google/benchmark。

我运行非常简单的测试

但我得到了错误

我尝试了主标签和旧标签,但我总是得到这个断言。我在 debian/testing 上使用 gcc 5.4.0 作为基准库和 simple-benchmark 可执行文件。

在我看来,它无法检测到参数列表的结尾并且它断言。但是有什么问题呢?如何预防?

0 投票
1 回答
361 浏览

c++ - 使用 googlebenchmark 核心转储对 CUDA 进行基准测试

我正在尝试使用google benchmark对一些 CUDA 代码进行基准测试。首先,我没有编写任何 CUDA 代码,只是想确保我可以对使用nvcc. 在main.cu我有

我编译:

当我运行程序时,我收到以下错误:

我已经明确指出nvcc并使用g++-4.9并重现了两个版本的问题。g++-4.8-ccbin g++-4.xg++

这里有什么明显的错误吗?如何解决问题?

如果重要的话,我使用的是 Ubuntu 17.04 和 NVIDIA 驱动程序版本 375.82。

更新:我安装g++-5了,核心转储消失了。

0 投票
0 回答
1153 浏览

protocol-buffers - 致命错误:基准/benchmark.h:没有这样的文件或目录

有谁知道下面的错误信息是什么意思?

我应该说我刚刚安装了 Google Protobuf。

0 投票
1 回答
2300 浏览

c++ - 谷歌基准代码设置

给定以下代码

我以为 std::cout << "Foo "<< std::endl; 只会执行一次,但在我的测试期间,它运行了 7 次。

所以我的问题是:

  1. 如何在基准测试之前只运行一次设置代码,例如“std::cout << "Foo "<< std::endl"?
  2. 当我使用“state.iterations()”时,我想一个一个地得到“1、2、3 ..”,但我却得到0。我怎样才能得到迭代器的seq数?

在我的真实案例中,我想在多线程场景中运行一些与存储引擎相关的代码。像这样的步骤:

  1. 打开与存储引擎的连接。让我们假设连接对象可以在不同的线程之间共享。
  2. 基于连接打开会话。让我们假设会话对象不能在线程之间共享。
  3. 运行许多 db_related 操作,这是我想要进行基准测试的唯一代码。
  4. 关闭会话,连接。

我有以下伪代码,但我认为它至少有 2 个问题。

问题:

  1. 我是否必须在这里使用全局变量 DBConnection 以便每个线程都可以访问它?
  2. 假设“DBSession* session = conn.openSession();” 可以在“真正设置好conn”之前执行,而且我也不想每次都对openSession进行基准测试,我该如何解决这个问题?

所以我总共有 2 个部分的 4 个问题,如果你对我的代码有更多的建议,那就更好了。谢谢!

0 投票
0 回答
67 浏览

c++ - LockFreeStack 基准测试(超额订阅状态)

我已经实现了无锁堆栈,基于 'Concurrency in action' 书籍示例。我想对其进行基准测试并将其与其他无锁堆栈进行比较,即来自 boost::lockfree。我使用谷歌基准框架来进行这些测试,测量不同争用下的单个操作时间(我的操作是指以随机顺序调用的推送/弹出)。

如您所见,我使用了 8 个线程的处理器。令我惊讶的是 16/32 线程 (lockFreeStack) 的结果,其中平均操作时间比 2/4/8 线程的结果短。每次我运行这些测试时,这种结果都是一致的。

这种行为有什么合乎逻辑的解释吗?

0 投票
2 回答
6655 浏览

c++ - 如何将参数传递给 Google Benchmark Program

我有一个 C++ Google 基准程序。它使用谷歌的BENCHMARK_MAIN()方法。现在我用 Go 脚本调用并执行编译后的程序。有没有办法将参数传递到我的基准程序中?(我知道主要方法的常用方法,但我不确定如何在 Googletest 中执行此操作,因为它已在其中实现benchmark_api.h,我不能只是更改它。)

更新:

到目前为止,我将宏体复制到我的benchmark.cpp并添加了一行。这不是一个好的解决方案,因为 Google 对此宏的可能更改(例如更改名称或添加的代码行)不会影响我的副本。它终于开始工作了。

0 投票
1 回答
233 浏览

c++ - 解释为什么分配第二次会改变性能

我正在测试一些关于密集矩阵乘法的微型基准(出于好奇),我注意到一些非常奇怪的性能结果。

这是一个最小的工作示例:

夹具的构造函数中有一个#if 0块,可以切换到#if 1我正在测试的两种不同场景。我注意到的是,由于某种原因,当我强制重新分配所有缓冲区时,由于某种原因,在我的系统上运行基准测试所需的时间神奇地提高了约 15%,我无法解释为什么这正在发生。我希望有人能在这方面启发我。我还想知道将来是否有任何额外的微基准测试“最佳实践”建议来避免此类奇怪的性能异常。

我是如何编译的(假设 Google Benchmark 已经安装在某个可以找到的地方):

$CC -o mult_test mult_test.cpp -std=c++14 -pthread -O3 -fno-omit-frame-pointer -lbenchmark

我一直在运行这个:

./mult_test --benchmark_repetitions=5

我正在 Ubuntu 18.04 x64(内核版本 4.15.0-30-generic)中进行所有测试

我尝试了该代码的几种不同变体,它们在多次运行中都给出了相同的基本结果(结果对我来说如此一致令人惊讶):

  1. 在基准“SetUp”阶段(非定时部分)内移动分配/初始化,以便分配/解除分配发生在每个新的采样点
  2. 在 GCC 7.3.0 和 Clang 6.0.0 之间切换编译器
  3. 尝试了具有不同 CPU 的不同计算机(Intel i5-6600K,以及一台具有双插槽 Xeon E5-2630 v2)
  4. 尝试了不同的方法来实现基准框架(即根本不使用 Google Benchmark 并通过 std::chrono 手动实现计时)
  5. 强制所有缓冲区对齐到几个不同的边界(64 字节、128 字节、256 字节)
  6. 在每个采样计时周期中强制进行固定次数的迭代
  7. 尝试以更高的重复次数跑步(20+)
  8. 使用性能调控器强制保持恒定的 CPU 时钟频率
  9. 为优化选项尝试了不同的编译器标志(删除了 no-omit-frame-pointer,尝试了 -march=native)
  10. 我尝试使用 std::vector 来管理存储,使用 new[]/delete[] 对和 malloc/free。他们都给出了相似的结果。

我比较了代码的热部分的组装,两个测试用例之间是相同的(其中一个案例的 perf 截图):

这是不执行重新分配的 perf stat 的代表性屏幕截图:

这是用于强制重新分配的 perf stat 的代表性屏幕截图:

这是一个最小的工作示例,它没有任何外部依赖项,并允许测试内存对齐问题:

编译:

0 投票
2 回答
924 浏览

c++ - 谷歌/基准不一致的结果

我是使用 Google Benchmark 的新手,并且在运行相同的基准(如下)时收到不同的结果,当在本地运行代码与在Quick-Bench.com上运行代码时,它使用 C++ 检索本地时间。两次我都使用了 GCC 8.2 和 -O3。

为什么在本地运行与在 quick-bench.com 上运行的结果差异很大?哪个是对的?

在本地产生以下结果:

QuickBench 结果:

0 投票
0 回答
551 浏览

c++ - 为什么 cpu 时间在基准测试中的波动通常比实时大?

在使用Google Benchmark框架检查我的基准测试的输出时,我观察到在许多情况下测量的 cpu 时间的标准偏差明显大于测量的实时标准偏差。

这是为什么?还是由于测量误差导致的结果?我对此感到非常惊讶,因为我预计 cpu 时间更具可重复性。

这是对我系统的一般观察。尽管如此,我还是提供了一个简单的例子:

该示例甚至不包含堆分配。编译器没有优化任何 sin/cos 函数。这就是所有的代码。时间测量完全在 Google Benchmark 库中完成,该库可在 github 上公开获得。但到目前为止我还没有研究过实现。

当使用命令行参数 --benchmark_repetitions=50 --benchmark_report_aggregates_only=true 运行程序时,我得到如下输出:

我在带有 Microsoft (R) C/C++ Optimizing Compiler Version 19.00.24218.1 for x86 (Visual Studio 2015) 和 /O2 的非常旧的 Intel Core i7 920 (Bloomfield) 上使用 Google Benchmark v1.4.1。


编辑:我在 Intel i5-4300U CPU 和 gcc-8.1.1 上对 Fedora-28 做了进一步的测量(它足够聪明,可以用 -O2 调用 sincos),并发现了一个对比的行为:

当省略 -O2 时(更接近 MSVC,因为它有单独的 sin/cos 调用),我仍然得到相同的定性结果:实时的标准偏差也大于 cpu 时间的标准偏差。

我不太确定从中得出什么结论。这是否意味着 Windows 上的时间测量不那么精确?

0 投票
1 回答
1033 浏览

c++ - Benchmark undefined reference to `std::thread::_M_start_thread CMake

I want to use Google Benchmark, for that I have a simple test written in main.cpp file. to build my project I have a CMake file as follow:

But every time I run "make" it gives me the error:

What am I doing wrong? I just started working with CMake so I don't have a lot of knowledge. I searched but couldn't get a solution. Thanks in advance for any help.