gpt4 book ai didi

c++ - vector 索引访问与迭代器访问的效率

转载 作者:可可西里 更新时间:2023-11-01 17:37:21 35 4
gpt4 key购买 nike

我有问题要纠正我对使用索引访问(使用运算符 [])或使用迭代器访问 vector 元素的效率的理解。

我的理解是“迭代器”比“索引访问”更有效率。(我还认为 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 命令来“测量”。数字是:

results using g++ source.cpp (no optimizations) index access

real 800ms

iterator access

real 2200ms

这些数字有意义吗? (我多次重复运行)我想知道我错过了什么细节以及为什么我错了......

results using g++ -O2 index access, time real: ~200ms

iterator access, time real: ~200ms

我在不同平台(amd64 w/g++ 和 power7 w xlC)上重复测试,发现我一直使用优化代码,示例程序的执行时间相似。

edit 更改代码以添加值 ( value += *iter ) 而不是仅使用赋值。添加了有关编译器选项的详细信息。添加了使用 -O2 的新数字。*edit2 更改了标题,将“迭代器效率”更正为“访问效率”。

最佳答案

没有看到测试工具、编译器选项以及你如何测了一下时间,不好说什么。此外,一个好的编译器可能能够在一种情况下消除循环,因为循环有对返回值没有影响。仍然,取决于实现,看到迭代器显着不会让我感到惊讶比索引更快(反之亦然)。

关于您的“理解”,没有任何内在的东西迭代器的类型及其性能。您可以编写前向迭代器非常快或非常慢,就像您可以编写随机访问一样非常快或非常慢的迭代器。在全局范围内,数据类型支持随机访问迭代器的结构可能有比那些没有的更好的地方,这可能有利于随机访问迭代器;但这还不够任何合理的概括。

关于c++ - vector 索引访问与迭代器访问的效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9506018/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com