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