Я переписываю код рендеринга C на C ++.Старый код C в основном вычисляет все, что ему нужно, и отображает его в каждом кадре.Вместо этого новый код C ++ предварительно вычисляет то, что ему нужно, и сохраняет его в виде связанного списка.
Теперь фактические операции рендеринга - это переводы, изменение цвета и вызовы списков GL.
При выполненииОперации в связанном списке должны быть довольно простыми, может показаться, что результирующий вызов метода занимает больше времени, чем старая версия (которая вычисляет все каждый раз - я, конечно, убедился, что новая версия не пересчитывается).
Странная вещь?Он выполняет меньше операций OpenGL, чем старая версия.Но это становится страннее.Когда я добавил счетчики для каждого типа операций и старый добрый printf в конце метода, он стал быстрее - и gprof, и ручные измерения подтверждают это.
Я также потрудилсявзгляните на ассемблерный код, сгенерированный G ++ в обоих случаях (с трассировкой и без нее), и никаких существенных изменений не произошло (что было моим первоначальным подозрением) - единственное отличие состоит в том, что для счетчиков выделяется еще несколько слов стека, увеличивая указанные счетчикии подготовка к printf с последующим переходом к нему.
Кроме того, это относится и к -O2, и к -O3.Я использую gcc 4.4.5 и gprof 2.20.51 в Ubuntu Maverick.
Наверное, мой вопрос: что происходит?Что я делаю неправильно?Что-то скинуло и мои измерения и gprof?