У меня есть вопрос, чтобы исправить мое понимание эффективности доступа к элементам вектора с помощью доступа к индексу (с помощью оператора []) или с помощью итератора.Эффективность доступа к векторному индексу против доступа итератора
Мое понимание - «итератор» более эффективно, чем «доступ к индексу». (также я думаю, vector::end()
более эффективен, чем vector::size()
).
Теперь я написал пример код измерить его (под Windows 7 с помощью Cygwin, с г ++ 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
(без оптимизации) доступа индексареального 800ms
доступа итератора
реальных 2200ms
ли эти числа? (Я повторил пробеги несколько раз) И я подумал, что детали я скучаю и почему я ошибаюсь ...
результаты использования г ++ -O2 доступа индекса, реальное время: ~ 200мс
доступа итератора, реальное время: ~ 200мс
Я повторил тесты на другой платформе (amd64 ж/г ++ и POWER7 ж XLC) и увидеть, что все время я использовал оптимизированный код примеров программ имеют одинаковое время выполнения.
Редактировать изменить код, чтобы добавить значения (value += *iter
) вместо простого назначения. Добавлены сведения о параметрах компилятора. Добавлены новые номера для использования -O2. * edit2 изменил название, исправляя «эффективность итератора» на «доступ к эффективности».
Убедитесь, что вы не компилируете с поддержкой отладки, особенно в MSVC. Кроме того, ваша первая версия не использует итераторы вообще, а во второй версии вы * * * имеете итераторы произвольного доступа. –
вы используете '-O2' /' -O3'? –
Вы включили оптимизацию? –