我读到基于范围的循环在某些编程语言上具有更好的性能。在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
?如果是,为什么?
最佳答案
这是一个粗略的测试。我并不是说这是关于哪个更快的明确答案,但在我看来,在这种特殊情况下,gcc 编译器能够将两个循环优化到大致相同的性能水平。如果您愿意,您绝对可以改进测试方法。
在我的系统上(Ubuntu 14.04,某种 i7,8 GB DDR3,gcc):
没有优化(g++ main.cpp -std=c++11):
Old-fashioned loop: 5.45131 seconds.
Range-based loop: 9.90306 seconds.
经过优化(g++ main.cpp -O3 -std=c++11):
Old-fashioned loop: 0.469001 seconds.
Range-based loop: 0.467045 seconds.
#include <iostream>
#include <vector>
#include <time.h>
using namespace std;
double time_elapsed(timespec& start, timespec& end)
{
return ((1e9 * end.tv_sec + end.tv_nsec) -
(1e9 * start.tv_sec + start.tv_nsec)) / 1.0e9;
}
int main()
{
vector<int> v(1e9, 42);
timespec start, end;
// Old-fashioned loop.
clock_gettime(CLOCK_MONOTONIC_RAW, &start);
size_t size = v.size();
for (size_t i = 0; i < size; i++)
{
v[i] *= v[i];
}
clock_gettime(CLOCK_MONOTONIC_RAW, &end);
cout << "Old-fashioned loop: " << time_elapsed(start, end) << " seconds\n";
// Range-based loop.
clock_gettime(CLOCK_MONOTONIC_RAW, &start);
for (int& val : v)
{
val *= val;
}
clock_gettime(CLOCK_MONOTONIC_RAW, &end);
cout << "Range-based loop: " << time_elapsed(start, end) << " seconds.\n";
}
关于C++ for 循环和基于范围的循环性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24916899/