Производительность — итерация по вектору с помощью итератора или указателя?

В настоящее время я пишу приложение, которое должно работать как можно лучше. Я использую VS2012 в качестве моей IDE (и компилятора).

Когда я перебираю векторы, я заметил, что решение с указателем, в отличие от итератора, намного быстрее с точки зрения скорости. Это почему? Я имею в виду, что итератор — это одно и то же. Это должно быть по крайней мере.

Взгляните на этот пример:

std::vector<int> v;
for (std::vector<int>::iterator it = v.begin(); it != v.end(); it++) {
// Do stuff with *it
}

for (int* i = &v[0], i <= &v[v.size()-1]; i++) {
// Do stuff with *i
}

Есть ли какая-либо оптимизация, которая нужна компилятору? Я использую все стандартные настройки, поэтому -O2 уже включен. Заранее спасибо.

РЕДАКТИРОВАТЬ:
Я компилирую в Release и работаю с Ctrl + F5 (без отладки).

EDIT2:
Фактический исходный код является реализацией быстрой сортировки. Вот ссылка на полный источник, это очень коротко, так что проверьте это.

3

Решение

В настоящее время я пишу приложение, которое должно работать как можно лучше.

Затем возьмите профилировщик и посмотрите, где настоящие узкие места. В оптимизированном коде (режим Release), конечно.

-O2 не все в VS2012: есть несколько #defines которые манипулируют поведением стандартных контейнерных итераторов в отношении проверки границ и других проверок безопасности. Возможно, вы захотите найти их («проверенные итераторы» и «безопасный SCL» могут привести вас к нужным сайтам) и настроить их соответствующим образом.

Но я очень сомневаюсь, что итерация над контейнерами станет вашим узким местом, будут другие разделы кода, более чувствительные к проблемам производительности.

4

Другие решения

Одна потенциальная причина заключается в том, что вы выполняете постинкрементный итератор, а не предварительно увеличиваете его. Попробуйте это вместо этого:

for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it)

Это может не увеличить вашу скорость, так как некоторые (может быть, большинство) компиляторы оптимизируют эту проблему. Однако иногда, когда вы выполняете постинкремент, необходимо сделать временную копию старого значения итератора, чтобы он мог вернуть то, что вы ожидаете в цикле. Это что-то попробовать в любом случае.

2

Один из простых способов повысить производительность — это не end метод на каждой итерации — тоже делай ++it не it++,

то есть

std::vector<int> v;
const std::vector<int>::iterator end = v.cend();
for (std::vector<int>::iterator it = v.begin(); it != end; ++it) {
// Do stuff with *it
}
1
По вопросам рекламы [email protected]