性能 - 使用迭代器或指针迭代向量?

时间:2013-03-13 07:54:14

标签: c++ performance vector iterator visual-c++-2012

我正在编写一个需要尽可能好的应用程序。我正在使用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的一个实现。 Here is a link to the full source,非常短,请查看。

3 个答案:

答案 0 :(得分:4)

  

我正在编写一个需要尽可能好的应用程序。

然后抓住一个分析器,看看真正的瓶颈在哪里。当然,在优化代码(发布模式)中。

-O2不是VS2012中的所有东西:有几个#defines操纵标准容器迭代器的行为来限制检查和其他安全检查。您可能希望查找它们(“已检查的迭代器”和“安全SCL”可能会引导您到达正确的站点)并相应地设置它们。

但我非常怀疑对容器的迭代将成为你的瓶颈,还会有其他代码段对性能问题更敏感。

答案 1 :(得分:2)

一个潜在的原因是你要对迭代器进行后递增而不是预先递增它。试试这个:

for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it)

这可能不会提高您的速度,因为一些(可能是大多数)编译器可以优化此问题。但是,有时当您进行后递增时,必须创建旧迭代器值的临时副本,以允许它返回您在循环中所期望的内容。无论如何都要尝试。

答案 2 :(得分:1)

提高效果的一种简单方法是不在每次迭代时执行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
}