1

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

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计算使用了多少时间和内存的库。我想从总数中排除转换。我就像文档中所说的那样实现了该功能,但是结果时间比没有计时器管理的正常计算要高得多。

我还发现了这个旧但相关的未解决问题,但我无法解决我的问题。我该如何解决这个问题,或者有任何解决这个问题的方法?

4

1 回答 1

1

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

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

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

于 2021-03-02T21:54:29.153 回答