@jekyll0_0

Что делать со скоростью работы итераторов в STL?

Пишу в данный момент алгоритм построения изображений трассировкой лучей, в качестве основного контейнера решил использовать STL vector. При поиске пересечений требуется перебирать элементы вектора (конечно, я знаю, что брутфорс в этом алгоритме - кощунство, но написание kd tree в процессе, а тестить надо было уже с первых строк кода). Так вот, не думал я, что итераторы настолько тормознутая штука, я предполагал это, но не настолько же.
Сначала я использовал их в своем коде вроде этого:

for (std::vector<ISceneObject*>::iterator i = objects.begin(); i != objects.end(); i++)
{
	if ((*i)->Hit(ray, t, info))
	{
		//...
	}
}

Решил переписать по рабоче-крестьянски, используя только индекс на текущий элемент массива. В итоге сцена стала отрисовываться в 2 раза быстрее. Решил потестить в профилировщике VTune, оказалось, что вызов инкремента итератора занимает примерно 0.5 секунды, столько же его разыменование.
Теперь вопрос: это действительно проблема реализации итераторов в STL или это я неправильно их использую?
  • Вопрос задан
  • 316 просмотров
Пригласить эксперта
Ответы на вопрос 4
maaGames
@maaGames
Погроммирую программы
Подозреваю, что 0,5 секунды уходит на функцию Hit. Не может разыменование столько времени занимать, даже в дебаг версии. Или ты работаешь на первом пентиуме, но под Windows 8 и с последней студией.
Просто в принципе не может столько времени уходить.
Кстати, выключи антивирус или добавь папку проекта в исключения. У меня тут особо умный антивирус проверял отлаживаемое приложение, запуская его в песочнице...
Ответ написан
Комментировать
@vilgeforce
Раздолбай и программист
500ms - как-то очень много, на мой взгляд. Дебажная сборка? Через GitTickCount() время попробуйте посмотреть, может профайлер что-то не то показывает...
Ответ написан
vt4a2h
@vt4a2h Куратор тега C++
Senior software engineer (C++/Qt/boost)
0) Убедитесь, что проблема действительно в скорости итерирования, а не в алгоритме или во внутренних функциях. Профайлер вам в руки. Просто, учитывая кеш-линию, итерирование должно быть очень и очень быстрым.
1) Если есть возможность использовать c++11, используйте for ( auto &&e : elements ) {}. Или, если есть буст, что-нибудь оттуда, boost_foreach там.
2) Если функция Hit вдруг константная, используйте соотвествующие итераторы.
3) Закешируйте objects.end(), чтобы вызывать один раз.
4) Используйте ++i, а не i++.
5) Попробуйте флаги оптимизации и релизную сборку.
Ответ написан
Комментировать
Trrrrr
@Trrrrr
1) Если тестили в дебаге, то потестите в релизе.
Если в релизе тестили, то еще задефайеите вот эти дефайны:
https://msdn.microsoft.com/en-us/library/hh697468.aspx

Должно быть одинаково все.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы