Там больше, чем один из способов сделать Это.
Don't forget the no-profiler method.
Большинство профайлеры предположим вам нужно 1) высокую статистическую точность времени (много образцов), и 2) низкая точность идентификации проблемы (функции & вызова-графики).
Эти приоритеты могут быть отменены. То есть проблема может быть установлена на точный адрес машины, тогда как предел стоимости является функцией количества выборок.
Большинство реальных проблем стоят не менее 10%, где высокая точность не является существенной.
Пример: Если что-то делает вашу программу занятой в 2 раза дольше, это значит, что в ней есть код, который стоит 50%. Если вы берете 10 выборок стека вызовов, пока он медленный, то точные строки кода будут присутствовать примерно на 5 из них. Чем больше программа, тем более вероятной проблемой является вызов функции где-то в середине стека.
Это противоречит интуиции, я знаю.
ПРИМЕЧАНИЕ: xПерф находится почти там, но не совсем (насколько я могу судить). Он берет образцы стека вызовов и сохраняет их - это хорошо. Вот что я думаю, что это необходимо:
Он должен брать только образцы, когда вы хотите их. Как бы то ни было, вы должны отфильтровать ненужные.
В представлении стека он должен показывать определенные строки или адреса, по которым происходят вызовы, а не только целые функции. (Может быть, он может это сделать, я не мог сказать из блога.)
Если вы нажмете, чтобы получить представление о бабочке, ориентированное на одну команду вызова или инструкцию листа, оно должно показать вам не долю ЦП, а долю выборок стека, содержащих эту инструкцию. Это будет прямая мера стоимости этой инструкции, как часть времени. (Может быть, он может это сделать, я не могу сказать.) Так, например, даже если инструкция была вызовом открытия файла или чего-то еще, что простаивает поток, он по-прежнему стоит настенное время, и вам нужно знайте это.
ПРИМЕЧАНИЕ: Я просто посмотрел на Люка Стаквокера, и те же замечания применяются. Я думаю, что это на правильном пути, но требует работы пользовательского интерфейса.
ADDED: Осмотрев LukeStackwalker более тщательно, я боюсь, что он стал жертвой предположения, что измерительные функции важнее, чем определение местоположения. Таким образом, на каждом образце стека вызовов он обновляет информацию о времени на уровне функции, но все, что она делает с информацией о номере линии, отслеживает минимальные и максимальные номера строк в каждой функции, что, чем больше образцов требуется, чем дальше. Таким образом, это в основном отбрасывает самую важную информацию - информацию о номере линии. Важной причиной является то, что если вы решите оптимизировать функцию, вам нужно знать, какие строки в ней нуждаются в работе, и эти строки были в образцах стека (до того, как они были отброшены).
Можно было бы возразить, что если информация о номере линии была сохранена, это быстро закончило бы хранение. Два ответа. 1) Есть только так много строк, которые появляются на образцах, и они появляются неоднократно. 2) Не так много образцов необходимо - предположение о необходимости высокой статистической точности измерения всегда принималось, но никогда не было оправдано.
Я подозреваю, что другие сэмплеры стека, такие как xPerf, имеют схожие проблемы.
Какая платформа? Я использую gprof, когда я работаю с g ++ в Linux. –
Моя программа работает под управлением Windows XP. – stanigator