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

C++ - Google 基准测试停止计时功能

如何解决C++ - Google 基准测试停止计时功能

我试图在函数中排除字符串到对象的转换。这是涉及的功能

std::vector<std::pair<value_type,size_t>> read_file(const std::string path,benchmark::State& state) {
  
  std::string kmer;
  std::vector<std::pair<value_type,size_t>> data;
  
  std::ifstream file(path);
  while (std::getline(file,kmer)) {
    state.PauseTiming();
    kmer_t tmp(kmer);
    state.ResumeTiming();
    data.push_back(std::make_pair(tmp.value,tmp.index));
  }

  return data;
}

函数作用域是读取一个文件,逐行转换成一个对象。结果对象被插入到一对向量中。 我在我的项目中包含 google benchmark 库来计算使用了多少时间和内存。我想从总数中排除转换。我像 documentation 所说的那样实现了这个函数,但结果时间比没有计时器管理的正常计算要长得多。

我也发现了这个旧但相关的 opened issue,但我无法解决我的问题。 我该如何解决这个问题,或者有什么办法可以解决这个问题?

解决方法

在这里您无能为力,这是意料之中的。启动和停止计时器需要与操作系统进行某种形式的同步,而在您的情况下,其开销似乎远高于创建临时对象。

不过,这应该不是问题。如果您尝试比较填充向量的几种方法并排除在所有这些方法中创建对象,那么对于所有这些不同的方法,停止和重新启动计时器的开销将相同,因此如果其中一种方法比另一个更快 增加定时器管理开销也会更快,只是相对差异会更小。

我什至会争辩说,在您测量文件的整个解析而不是微基准测试的情况下,例如push_backemplace_back 最好在测量中包含对象创建,以便更准确地了解性能差异的显着性,例如将此版本与在迭代之间重用 kmer_t 对象的版本进行比较时(因此可能重用已为数据成员分配的内存)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 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”。这是什么意思?