【发布时间】:2013-08-13 15:44:36
【问题描述】:
为了提高应用程序的性能,我们必须在开发阶段考虑循环优化技术。
我想向您展示一些不同的方法来迭代一个简单的std::vector<uint32_t> v:
-
带索引的未优化循环:
uint64_t sum = 0; for (unsigned int i = 0; i < v.size(); i++) sum += v[i]; -
带有迭代器的未优化循环:
uint64_t sum = 0; std::vector<uint32_t>::const_iterator it; for (it = v.begin(); it != v.end(); it++) sum += *it; -
缓存的
std::vector::end迭代器:uint64_t sum = 0; std::vector<uint32_t>::const_iterator it, end(v.end()); for (it = v.begin(); it != end; it++) sum += *it; -
预增量迭代器:
uint64_t sum = 0; std::vector<uint32_t>::const_iterator it, end(v.end()); for (it = v.begin(); it != end; ++it) sum += *it; -
基于范围的循环:
uint64_t sum = 0; for (auto const &x : v) sum += x;
还有其他方法可以在 C++ 中构建循环;例如通过使用std::for_each、BOOST_FOREACH 等...
在您看来,提高性能的最佳方法是什么?为什么?
此外,在性能关键的应用程序中,展开循环可能很有用:同样,您会建议哪种方法?
【问题讨论】:
-
具有良好优化的良好编译器应该为所有这些产生相同的程序集。如果您的编译器支持
restrict关键字,您可以通过抓取向量的数组并在 for 循环中求和(更多的 C 方法)来获得更好的性能。你可能不会。查看优化下的程序集,看看是否有任何不同。 -
过早优化是万恶之源。
-
@Snps 你怎么知道它为时过早? OP 很可能已经确定了一个关键瓶颈。不回答问题的老生常谈是没有用的。
-
@sfstewman “在开发阶段”——可能为时过早。
-
@Xaqq 取决于应用程序的类型。如果您正在编写模拟软件或游戏,开发通常具有性能标准。开发结束时的优化是正常的。
标签: c++ loops optimization vector iterator