【发布时间】: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