2010-11-11 2 views
1

У меня есть некоторый сильно шаблонный код C++, с которым я работаю. Я могу скомпилировать и профилировать инструменты AMD и спать в режиме отладки. Однако без оптимизации большая часть времени проводилась в шаблоном и STL. С оптимизированной компиляцией все инструменты профиля, которые я знаю, вызывают информацию о мусоре. Кто-нибудь знает хороший способ профилировать собственный кодПрофили оптимизированы Код C++/C

PS1: Код, который я пишу, также сильно затенен. Большая часть времени, проведенного в неоптимизированном коде, будет оптимизирована. Я говорю о 96-97% времени выполнения, потраченных в шаблоном коде без оптимизации. Это приведет к повреждению точности профилирования. И да, я могу изменить многие шаблоны кода или, по крайней мере, какая часть шаблонного кода представляет наибольшую проблему, и я могу сделать лучше в этих местах.

+1

Если вы делаете это в Linux, используйте gprof. –

ответ

3

Вы должны сосредоточиться на написанном вами коде, потому что это то, что вы можете изменить, время, проведенное в STL, не имеет значения, просто игнорируйте его и сосредоточьтесь на вызывающих лицах этого кода. Если в STL слишком много времени, вы, вероятно, можете вызвать какой-то другой примитив STL вместо текущего.

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

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

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

+0

++, особенно для первого абзаца. –

+1

@Mike Dunlavey: Спасибо за ваш комментарий. Особенно приятно от вас, как ваш ответ на ** Оптимизация производительности в последней инстанции? ** (http://stackoverflow.com/questions/926266/performance-optimization-strategies-of-last-resort/927773# 927773) является одним из моих предпочтительных ответов на SO. – kriss

+0

Я имел в виду это. Я смущен, когда вижу, что эти графики вызовов показывают слои сети в библиотеках, где вы ничего не можете с этим поделать. Может быть, это образовательный процесс. –

2

Что вы подразумеваете под "информацией о мусоре"?

Профилирование имеет смысл только для оптимизированных сборок, поэтому инструменты предназначены для работы с ними, поэтому, если вы получаете бессмысленные результаты, вероятно, из-за того, что профилировщик не находит правильные символы или не нуждается в инструменте сборки ,

В случае с Intel VTune, например, я обнаружил, что у меня были невозможные результаты из сэмплера, если я явно не сказал, где найти PDB для исполняемого файла, который я настраивал. В инструментальной версии мне пришлось возиться с настройками, пока он не надежно ввел зонды в вызовы функций.

1

Когда @kriss говорит

Вы должны сосредоточиться на код, который вы написали , потому что это то, что вы можете изменить

, что это именно то, что я собирался сказать.

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

Я не ищу такой код, измеряя время.Если избыточное время составляет, скажем, 20%, то то, что я делаю, случайным образом приостанавливает его несколько раз. Как только я вижу что-то, что, очевидно, может быть улучшено на 2 или более образцах, я нашел его. It's an oddball method, but it doesn't really miss anything. Я измеряю общее время до и после, чтобы увидеть, сколько я спас. Это можно сделать несколько раз, пока вы не сможете найти что-нибудь, что можно исправить. (BTW, если вы в Linux, Zoom - это более автоматизированный способ сделать это.)

Затем вы можете включить оптимизатор и посмотреть, сколько он вам дает, но когда вы видите, какие изменения вы сделали, вы может видеть, что компилятор действительно не мог сделать это для вас.

Смежные вопросы