我有问题纠正我通过使用索引访问(使用运算符[])或使用迭代器访问向量元素的效率的理解。向量索引访问与迭代器访问的效率
我的理解是“迭代器”比“索引访问”更有效率。 (我认为vector::end()
比vector::size()
更有效)。
现在我写示例代码测量它(在Windows 7下使用Cygwin,使用g ++ 4.5.3)
索引接入环路版本(以前标记为随机接入):
int main()
{
std::vector<size_t> vec (10000000);
size_t value = 0;
for(size_t x=0; x<10; ++x)
{
for (size_t idx = 0; idx < vec.size(); ++idx)
{
value += vec[idx];
}
return value;
}
}
该迭代循环代码是这样的:
for (std::vector<size_t>::iterator iter = vec.begin(); iter != vec.end(); ++iter) {
value = *iter;
}
我很惊讶地看到“索引访问”版本更快。我使用time
命令来“测量”。数量分别为:
结果使用
g++ source.cpp
(不优化) 索引访问真正的800ms
迭代器访问
真正2200ms
,这些数字有意义吗? (我拉肚子多次重复的),我不知道什么细节我想,为什么我错了......
结果使用G ++ -02 索引访问,时间真:〜200ms的
迭代器访问,真实时间:〜200毫秒
我重复不同的平台上测试(AMD64瓦特/ g ++以及POWER7瓦特方xIC)和看到,我使用的所有时间优化的代码的示例方案也有类似的执行时间。
编辑更改代码以添加值(value += *iter
)而不是仅使用赋值。增加了关于编译器选项添加了使用-O2的新号码。 * edit2将标题改为“迭代器效率”改为“访问效率”。
确保您没有编译调试支持,尤其是在MSVC下。另外,你的第一个版本根本不使用迭代器,而在第二个版本中你有*随机访问迭代器。 – 2012-02-29 20:24:15
你在使用'-O2' /'-O3'吗? – 2012-02-29 20:25:50
你打开优化了吗? – 2012-02-29 20:26:54