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