问题标签 [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 回答
47 浏览

c++ - 如何使用谷歌基准测试数据包处理功能?基本上是在状态约束下重复的功能?

基本上我想在遍历数据包转储文件时测量时间。查看谷歌基准文档,我附带了:

以上是一个伪代码,它使用手动时间来测量和设置迭代时间。问题基本上是:

  1. 我可以break从谷歌基准的 for 循环中了解状态吗?
  2. 我可以continue在不设置迭代时间的情况下对状态进行谷歌基准测试吗?
0 投票
1 回答
1199 浏览

c++ - 谷歌基准夹具:跨多个基准重用向量

加载大文件后,我想使用谷歌基准库运行多个基准测试。为此,我使用以下代码。该函数read_collection()加载文件的内容,基准Build处理来自coll.

当我运行这段代码时,每个带有参数 10 和 20 的基准测试都会执行构造函数(总共两次),运行基准测试,然后调用析构函数。所以输出看起来像

这最终会花费太多时间来多次读取(相同的)文件,并且还会占用额外的内存来保存多个基准测试的相同数据。我也担心结果是否会受到页面错误的影响。因此,我有两个问题:

  1. 有没有办法避免读取文件两次,因为它可以节省一些执行时间(尽管这段时间不计入基准测试)。
  2. (如果不是)如何以每个基准调用构造函数、执行基准测试、破坏然后继续下一个基准测试的方式重组多个基准测试代码?(当然不必使用多个main功能)

更新 1

我需要注册的基准是不同的。我不希望将不同的参数传递给相同的基准。我已经用Build1和相应地更新了这个问题Build2

0 投票
2 回答
801 浏览

c++ - 带有命令行参数的 Google 基准测试。编写我自己的主要功能?

我有一个类似的代码:

我想将其更改为:

我这样做只是为了以后可以为代码提供命令行参数支持。现在这段代码编译成功,但我根本没有得到任何输出。我猜代码甚至没有运行。第一个代码大约需要 5 分钟才能完成,但第二个代码几乎立即完成执行。我究竟做错了什么?

任何帮助都会很棒。谢谢..

编辑:

由于我不能分享完整的代码,这里有一个最小可重现的例子:

0 投票
0 回答
126 浏览

google-benchmark - 谷歌基准不写入输出文件

我正在使用谷歌基准测试两种算法的性能。但是,benchmark_out命令似乎对我不起作用。

1) 标志--benchmart_out=/home/knn.json --benchmark_format=json给出错误invalid file name: '/home/knn.json

2) flags--benchmart_out=./knn.json --benchmark_format=json使用控制台日志成功运行基准测试,但不创建.json.

给出的标志输入有什么问题吗?

0 投票
2 回答
1496 浏览

benchmarking - 如何在谷歌基准测试中对迭代次数进行特殊处理?

我知道--benchmark_repetitions旗帜,这不是我需要的。我希望能够为一个基准指定迭代次数。我可以使用一个--benchmark_iterations设置所有基准的迭代次数的标志。

我知道谷歌基准测试很聪明,可以计算出需要多少次迭代才能获得良好的测量结果。这对于大多数用例来说已经足够了,但我的用例不同。我需要能够精确控制迭代次数。

0 投票
1 回答
325 浏览

c++ - Google Benchmark,如何只调用一次代码?

我有一个代码片段,我需要对由两部分组成的基准进行基准测试,首先状态需要设置一次,接下来我需要对函数进行实际基准测试。

我的代码如下所示:

在我的输出中,我得到:

多次,这是一条自定义错误消息,指示一个非常重要的指针,它应该只被触摸一次,试图被覆盖。

在我的实现中多次调用该代码是未定义的行为。我怎样才能调用对象初始化一次,然后告诉它调用循环?

0 投票
5 回答
1000 浏览

c++ - 为什么 for 循环体中的一个基本算术运算比两个算术运算执行得慢?

当我尝试测量算术运算的执行时间时,我遇到了非常奇怪的行为。包含for在循环体中具有一个算术运算的循环的代码块的执行速度总是比相同的代码块慢,但在for循环体中具有两个算术运算。这是我最终测试的代码:

我使用不同级别的代码优化 ( -O0, -O1, -O2, -O3) 和不同的在线编译器 (例如onlinegdb.com ) 在我的工作机器上、在我的 hame PC 和笔记本电脑上、在 RaspberryPi 和我同事的计算机上对此进行了测试。我重新排列了这两个代码块,重复了它们,更改了常量,更改了操作(+-<<=等),更改了整数类型。但我总是得到类似的结果:循环中有一行的比有两行的块慢:

1.05681 秒。x,y =
3100000000,0 0.90414 秒。x,y = 1700000000,-3700000000

我检查了https://godbolt.org/上的程序集输出,但一切看起来都像我预期的那样:第二个块在程序集输出中又多了一个操作。

三个操作总是按预期运行:它们比1慢,比4快。那么为什么两次操作会产生这样的异常呢?

编辑:

让我重复一遍:我的所有 Windows 和 Unix 机器上都有这样的行为,但代码没有优化。我查看了我执行的程序集(Visual Studio、Windows),我看到了我想在那里测试的指令。无论如何,如果循环被优化掉,我在剩下的代码中没有任何问题。我在问题中添加了优化通知以避免“不测量未优化代码”的答案,因为优化不是我所问的。问题实际上是为什么我的计算机执行两个操作比一个更快,首先是在这些操作没有被优化掉的代码中。在我的测试中,执行时间的差异是 5-25%(非常明显)。

0 投票
0 回答
110 浏览

c++ - 基准 C `std::isdigit`

我正在尝试std::isdigit从标头中对函数进行基准测试(为了清楚起见,从Ccctype继承的函数)。

代码片段如下:

很容易推断这GenerateRandomChar是一个简单的函数,它会生成随机数char,并且不会给基准测试本身带来任何开销。


"""不幸的是""",编译器能够完全优化代码。它正确地生成了预期的代码std::isdigit,但是,在基准测试的汇编代码中,基本块被忽略了。

以下是分析生成的代码(由gcc-10.1.0):

性能报告

如您所见,std::isdigit代码已生成(编译器资源管理器示例):

但由于循环,它被完全忽略:

小笔记

C++版本”(带语言环境)生成预期代码:测试函数代码的循环。

性能代码 C++


我的问题是:

  • 为什么benchmark::DoNotOptimize不适用于此特定功能?
  • 我如何更改基准代码以正确测量该功能的时间性能?
最后的笔记
  • 我在clang编译器上遇到了同样的“问题”。
  • 我试图将测试的函数“移动”到另一个翻译单元(强制非内联属性),但我遇到了同样的“问题”。
0 投票
1 回答
169 浏览

c++ - 如何使用谷歌基准测试自定​​义界面

因为除了 github 自述文件之外我找不到真正好的资源或文档,我会在这里询问社区。

假设我有一个名为 的接口Base和多个派生类型。
我想Foo用相同的函数和传递给的相同参数对所有派生类型的虚函数进行基准测试Foo
对于每个派生类型,我想Foo在单个基准测试中使用从std::vector<std::size_t>.

我的一些派生类型的构造函数也需要额外的参数,我应该如何处理它?

在我看来,最简单的做法是使用模板化基准测试并传递给:

我觉得这不是正确的方法,因为对于每个具有不同构造函数签名的派生类型,我需要具有与前一个几乎相同的不同基准函数。

对此进行基准测试的正确方法是什么?

**更新*:我解决这个问题的方法如下:

但我不喜欢的是基准测试的名称是模式func/0-5,我希望它是func/Derived1func/Derived2等等..有什么想法可以实现吗?

0 投票
1 回答
542 浏览

c++ - _mm256_load_ps 在调试模式下导致 google/benchmark 出现分段错误

  • 以下代码可以在发布模式和调试模式下运行。

  • 以下代码只能在发布模式下运行,在调试模式下会出现分段错误。