【发布时间】:2018-05-06 20:40:08
【问题描述】:
我读到基于范围的循环在某些编程语言上具有更好的性能。在 C++ 中是这种情况吗? 比如;
int main()
{
vector<int> v = {1, 2, 3, 4, 5};
auto size = v.size();
// LOOP1
for (int i = 0; i < size; i++) {
// do something with v[i]
}
// LOOP2
for (int& val : v) {
// do something with val
}
return 0;
}
当vector 的大小很大时,LOOP2 的性能是否优于 LOOP1?如果有,为什么?
【问题讨论】:
-
不公平的比较。您正在复制第二个版本中的所有元素。如果这是固定的,那么差异应该可以忽略不计,如果存在的话。适当地测试它们会比我更能告诉你。
-
优化器必须做更多的工作来优化第一个循环,但这与您在此处使用的迭代类型有关。对于某些(较旧的)编译器,使用迭代器进行迭代可能更有效。我前段时间使用 VS2010 和矩阵容器对此进行了测试。
-
这似乎可以作为基准。我希望
int& val的循环至少与另一个循环一样优化。如果您发现不同,也许您可以展示一个工作示例和两个循环的运行时间,并询问为什么会这样。 -
我曾经听过 Andrei Alexandrescu 说,衡量让你比那些优秀到不需要衡量的人更有优势。 :)
-
range-for 是迭代器的语法糖。因此,您实际上是在比较使用索引与使用迭代器,而且我确信在 SO 上有较早的帖子就是这样做的。