性能-使用迭代器或指针迭代vector
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已经启用了。提前谢谢。
编辑:我在发布中编译,并使用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
}
相关文章:
- std::vector::迭代器是否可以合法地作为指针
- 不明白迭代器,引用和指针失效,一个例子
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 在C++中释放内存期间,迭代器与指针有何不同
- 迭代器的指针操作问题
- 对于随机访问迭代器(矢量迭代器),迭代器C++样式指针吗?
- 专门C++使用指针值类型的通用迭代器的模板函数?
- 从 std::vector 迭代器中执行函数指针
- foor 循环的最后一次迭代中的指针更改
- 使用 map<char,strring> 的迭代器返回指针 map<char,strring>*
- 迭代器是否分配内存(如指针)?
- 如何在C++中重新实现包含指针的 STL 容器的类的迭代器
- 为什么第一次迭代后的指针指向随机值?
- 在指针迭代中使用for循环时出现分段错误
- 将unordered_map元素指向指针/迭代器
- 如何制作指针迭代器
- 如何在C++中存储对 stl 容器元素的指针/迭代器引用
- STL容器迭代器和C指针迭代器之间的区别是什么
- 公开begin()和end()的const和非const版本,以使用智能指针迭代成员向量
- 性能-使用迭代器或指针迭代vector