3

我目前正在编写一个需要尽可能好地执行的应用程序。我使用 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: 实际的源代码是快速排序的实现。这是完整源代码的链接,非常短,请查看。

4

3 回答 3

4

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

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

-O2 不是 VS2012 中的一切:有几个#defines可以操纵标准容器迭代器的行为,包括边界检查和其他安全检查。您可能想要查找它们(“检查迭代器”和“安全 SCL”可能会引导您到正确的站点)并相应地设置它们。

但我非常怀疑容器上的迭代是否会成为您的瓶颈,会有其他代码部分对性能问题更敏感。

于 2013-03-13T08:01:39.220 回答
2

一个潜在的原因是您正在对迭代器进行后递增而不是对其进行预递增。试试这个:

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

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

于 2013-03-13T07:59:32.580 回答
1

提高性能的一种简单方法是不要end在每次迭代时都执行该方法 - 也不++it要这样做it++

IE

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
}
于 2013-03-13T08:07:26.270 回答