这是遍历数组的更快方法

时间:2013-12-07 02:34:18

标签: c++ performance data-structures

比较以下两个代码:

for (int i = 0; i<array_size; i++)
  cout << array[i] << endl;

OR

int* p_end = array+array_size;
for (int* p_array = array; p_array != p_end; p_array++)
  cout << *p_array << endl;

哪一个更快?

另一个问题是,如果我们只想遍历哪个更快:链接列表或数组?三江源!

3 个答案:

答案 0 :(得分:1)

array[i] 可能更快,因为编译器知道你没有将指针别名化到你真正不应该的位置。

由于在每个节点之间施加间接,列表的遍历要慢得多 - 这会破坏您的缓存并导致许多缓存未命中,这可能是现代处理器可能发生的最糟糕的事情。

答案 1 :(得分:0)

第一个可能在阵列上更快。

第二个终止于在结构中找到零条目。这真的不是一回事。但是假设您将代码更改为:

p_array = array;
for (int i = 0; i < array_size; ++i, ++p_array)
    cout << *p_array << endl;

对于任何现代编译器,该循环可能需要与第一个循环相同的时间。 (实际上,cout的费用无论如何都会淹没一切。)

迭代容器的最佳方法实际上是由容器决定的。 vector<T>允许通过operator[]进行O(1)随机访问。此外,它的迭代器提供O(1)operator++。相比之下,像list<T>这样的容器只允许您使用operator++,而它是O(1)。

最后的想法:你可能希望坚持使用C ++中的预增量而不是后增量。

答案 2 :(得分:0)

请注意以下事项:

for (int i = 0; i<array_size; i++)
  cout << array[i] << endl;

每个循环必须 - 将i与数组大小进行比较,增加i,将i添加到数组

int* p_end = array+array_size;
for (int* p_array = array; p_array != p_end; p_array++)
  cout << *p_array << endl;

你必须每个循环 - 将p_array与p_end进行比较,增加p_array (这里没有添加)

所以看起来第二个循环 - 因为它不需要做一个添加应该更快

然而 - 优化器可以做很多事情所以我建议编译两者然后比较每个循环的asm

另外针对您的第二个问题 - 由于每个节点的加载时间,并且因为它们占用更多内存所以可以缓存更少的节点,因此数组比链接列表更快遍历