2009-04-08 2 views
6

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

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

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

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

ответ

5

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

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

+0

Я не могу говорить для CodeAnalyst, но oprofile поражает! команда opannotate дала мне аннотацию исходной строки так же, как вы описали. Благодаря! – Adam

+1

CodeAnalyst - это графический интерфейс над специализированной версией oprofile. Вы также можете использовать CodeAnalyst в Linux. – Carlos

6

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

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

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

+0

Спасибо, Грег! Если бы это не было для oprofile (см. Ниже), я бы подумал, что я бы выбрал идею точной точности, которую вы предложили. – Adam

1

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

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