性能-使用迭代器或指针迭代vector

Performance - iterating over vector with iterator or pointer?

本文关键字:指针 迭代 vector 迭代器 性能      更新时间:2023-10-16

我目前正在编写一个应用程序,需要执行得尽可能好。我使用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已经启用了。提前谢谢。

编辑:

我在发布中编译,并使用Ctrl+F5运行(没有调试)。

EDIT2: 实际的源代码是快速排序的实现。这里有一个链接到完整的源代码,它很短,所以请查看。

我目前正在编写一个应用程序,需要执行得尽可能好。

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

-O2不是VS2012的全部:有几个#defines可以操作标准容器迭代器的行为,包括边界检查和其他安全检查。您可能想要查找它们("检查迭代器"answers"安全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
}