【问题标题】:Why C++ template code runs faster in my lambdas?为什么 C++ 模板代码在我的 lambdas 中运行得更快?
【发布时间】:2020-09-06 09:29:27
【问题描述】:

我一直在做一些简单的向量数据累积测试,想知道为什么下面的代码:

template<typename T>
T accum(typename vector<T>::const_iterator first, typename vector<T>::const_iterator last, T init) {
  for(; first != last; ++first)
    init += *first;
  return init;
}

比以下代码运行得更快(都在 lamda 中)?

test("Iterator/direct", table, [](auto& values) {
  auto sum {0.0};
  for(auto i = values.begin(); i != values.end(); ++i)
    sum += *i;
  return(sum);
});

在我看来,算法本身应该是差不多的。

完整的源代码(53行)可以在this Gist找到。

【问题讨论】:

  • 这个问题几乎没有意义,它取决于编译器使用的优化。唯一的问题是第二个版本中的sum总是double
  • 当您询问性能时,请提供有关编译器和命令行选项的信息。
  • 这些版本之间有两个区别:1. lambda 使用非常量迭代器,2. lambda 在每次迭代时调用 end()。如果您在没有优化 (-O0) 的情况下进行编译,这确实会产生影响,但是使用优化 (-O2) 时,性能差异几乎可以忽略不计。
  • 在 Compiler Explorer 中输入代码并研究输出程序集。在不同的编译器和优化级别中,您可能会得到不同的结果。 godbolt.org
  • r3mus n0x 你是对的。优化后,差异将是“相同的”。谢谢。

标签: c++ templates vector lambda


【解决方案1】:

使用 -O2 选项编译,执行时间几乎可以忽略不计。非常感谢所有评论者。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-29
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多