[英]Performance - iterating over vector with iterator or pointer?
我正在编写一个需要尽可能好的应用程序。 我正在使用VS2012作为我的IDE(和编译器)。
我注意到,因为我在向量上迭代,与迭代器相比,指针解决方案在速度方面要快得多。 这是为什么? 我的意思是,迭代器基本上是一回事。 它至少应该是。
看看这个例子:
std::vector<int> v;
for (std::vector<int>::iterator it = v.begin(); it != v.end(); it++) {
// Do stuff with *it
}
for (int* i = &v[0], i <= &v[v.size()-1]; i++) {
// Do stuff with *i
}
编译器是否需要进行任何优化? 我正在使用所有标准设置,因此已启用-O2。 提前致谢。
编辑:我在Release中编译,并使用Ctrl + F5运行(没有调试)。
EDIT2:实际的源代码是quicksort的一个实现。 这是一个完整源代码的链接 ,它很短,所以检查出来。
我正在编写一个需要尽可能好的应用程序。
然后抓住一个分析器,看看真正的瓶颈在哪里。 当然,在优化代码(发布模式)中。
-O2不是VS2012中的所有内容:有几个#defines
操纵标准容器迭代器的行为以限制检查和其他安全检查。 您可能希望查找它们(“已检查的迭代器”和“安全SCL”可能会引导您到达正确的站点)并相应地设置它们。
但我非常怀疑对容器的迭代将成为你的瓶颈,还会有其他代码段对性能问题更敏感。
一个潜在的原因是你是在增加迭代器而不是预先递增迭代器。 试试这个:
for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it)
这可能不会提高您的速度,因为一些(可能是大多数)编译器可以优化此问题。 但是,有时当您进行后递增时,必须创建旧迭代器值的临时副本,以允许它返回您在循环中所期望的内容。 无论如何都要尝试。
提高性能的一种简单方法是不在每次迭代时都使用end
方法 - 也不是++it
而it++
。
即
std::vector<int> v;
const std::vector<int>::iterator end = v.cend();
for (std::vector<int>::iterator it = v.begin(); it != end; ++it) {
// Do stuff with *it
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.