c ++ профилирование / оптимизация: как улучшить детализацию профилирования в оптимизированной функции - PullRequest
6 голосов
/ 08 апреля 2009

Я использую Google Perftools (http://google -perftools.googlecode.com / svn / trunk / doc / cpuprofile.html ) для профилирования процессора - это замечательный инструмент, который помог мне выполнить большое количество улучшений процессорного времени в моем приложении.

К сожалению, я дошел до того, что код все еще немного медленный, и при компиляции с использованием уровня оптимизации gO3 -O3 все, что я знаю, это то, что определенная функция работает медленно, но не то, какие ее аспекты являются медленными.

Если я уберу флаг -O3, то неоптимизированные части программы обгонят эту функцию, и я не получаю много ясности в реальных медленных частях функции. Если я оставлю флаг -O3 внутри, то медленные части функции будут встроены, и я не смогу определить, какие части функции медленные.

Есть предложения? Спасибо за вашу помощь!

Ответы [ 3 ]

6 голосов
/ 08 апреля 2009

Для чего-то подобного я всегда использовал способ «старой школы»:

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

Если издержки вызова функции не являются проблемой, вы также можете принудительно отключить встраивание с помощью -fno-inline-small-functions -fno-inline-functions -fno-inline-functions-called-once -fno-inline (я не совсем уверен, как эти переключатели взаимодействуют друг с другом, но я думаю, что они независимы). Затем вы можете использовать свой обычный профилировщик, чтобы посмотреть профиль графика вызовов и посмотреть, какие вызовы функций занимают какое количество времени.

5 голосов
/ 09 апреля 2009

Если вы используете Linux, используйте oprofile . Если вы используете Windows, используйте AMD CodeAnalyst .

Оба предоставят профили на основе выборки до уровня отдельных строк исходного кода или инструкций по сборке, и у вас не должно возникнуть проблем при определении «горячих точек» в функциях.

1 голос
/ 10 апреля 2009

Я потратил десятилетия на настройку производительности.

Люди любят свои инструменты, но я клянусь этим методом .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...