Эффективность доступа к векторному индексу по сравнению с доступом к итератору

У меня есть вопрос, чтобы исправить мое понимание эффективности доступа к элементам вектора с помощью доступа по индексу (с оператором []) или с помощью итератора.

Насколько я понимаю, «итератор» более эффективен, чем «доступ по индексу». (также я думаю, что 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 (без оптимизации) индексный доступ

реальный 800 мсек

итераторный доступ

реальный 2200 мсек

Имеют ли эти числа смысл? (Я повторил прогоны несколько раз) И мне стало интересно, какие детали я упускаю и почему ошибаюсь ...

результаты с использованием g ++ -O2 доступ к индексу, реальное время: ~ 200 мс

доступ к итератору, реальное время: ~ 200 мс

Я повторил тесты на другой платформе (amd64 w / g ++ и power7 w xlC) и увидел, что все время я использовал оптимизированный код в примере программы имеют одинаковое время выполнения.

edit изменил код для добавления значений ( value + = * iter ) вместо простого использования присваивания. Добавлены подробности о параметрах компилятора. Добавлены новые числа для использования -O2. * edit2 изменил заголовок, исправляя "эффективность итератора" на "эффективность доступа".

8
задан Carsten Greiner 1 March 2012 в 08:33
поделиться