游戏引擎微优化情况:我使用C++11 range for循环在vector<int>上使用auto关键字进行迭代。
更快的是:
for(auto value : ints) ...或
for(auto& value : ints) ...发布于 2013-05-13 22:11:29
在关心哪个更快之前,你应该关心哪个在语义上是正确的。如果不需要更改正在迭代的元素,则应选择第一个版本。否则,您应该选择第二个版本。
当然,您可以反对,即使不需要更改向量的内容,仍然可以选择使用对const的引用
for(auto const& value : ints)然后问题就变成了:哪个更快?通过引用const还是通过值?
同样,您应该首先考虑上面的语义是否正确,这取决于您在for循环中所做的事情:
int i = 0;
for (auto const& x : v) // Is this correct? Depends! (see the loop body)
{
v[i] = 42 + (++i);
std::cout << x;
}也就是说,对于基本类型,只要在语义上是正确的,我就会使用for (auto i : x)。
我不认为性能会更差(相反,我希望性能会更好),但一如既往地,当涉及到性能时,支持您的假设的唯一有意义的方法就是测量、测量和测量。
发布于 2013-05-13 22:09:02
如果修改value并希望它修改向量中的实际元素,则需要auto&。如果您不修改value,它很可能会被编译成与auto或auto&完全相同的代码(自己分析一下)。
我用基于QueryPerformanceCounter的计时器使用VS2012进行了一些计时...
m::HighResTimer timer;
std::vector<int> ints(100000000, 17);
int count = 0;
timer.Start();
for(auto& i : ints)
count += i;
timer.Stop();
std::cout << "Count: " << count << '\n'
<< "auto& time: " << duration_cast<duration<double, std::milli>>(timer.Elapsed()).count() << '\n';
count = 0;
timer.Reset();
timer.Start();
for(const auto& i : ints)
count += i;
timer.Stop();
std::cout << "Count: " << count << '\n'
<< "const auto& time: " << duration_cast<duration<double, std::milli>>(timer.Elapsed()).count() << '\n';
count = 0;
timer.Reset();
timer.Start();
for(auto i : ints)
count += i;
timer.Stop();
std::cout << "Count: " << count << '\n'
<< "auto time: " << duration_cast<duration<double, std::milli>>(timer.Elapsed()).count() << '\n';结果..。
Count: 1700000000
auto& time: 77.0204
Count: 1700000000
const auto& time: 77.0648
Count: 1700000000
auto time: 77.5819
Press any key to continue . . .我不会在这里解读时差。对于所有的实际目的,它们都是相同的,并且会有轻微的波动。
发布于 2013-05-13 22:11:41
首先,如果您要修改值,请使用auto&,否则请不要这样做,因为您可能会意外更改它。
但在const auto&和简单的auto之间可能会有选择。我相信对于std::vector<int>来说,性能不是问题。
为什么要使用auto
vector)为什么要使用const auto&
在这两种情况下,你都应该知道你在做什么,。这可能取决于周期是否以某种方式改变了我们的范围。
https://stackoverflow.com/questions/16524057
复制相似问题