2011-02-08 3 views
8

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

Это очень хорошо, но иногда мне больше нравится то, что было в программе, большую часть времени, чем когда-либо было EIP.

Пример вывода моего гипотетического профилировщика является:

Waiting for file IO - 19% of execution time. 
Waiting for network - 4% of execution time 
Cache misses  - 70% of execution time. 
Actual computation - 7% of execution time. 

Есть ли такая профайлер? Можно ли получить такой вывод из «стандартного» профилировщика?

Я использую Linux, но я буду рад услышать любые решения для других систем.

+0

Есть ли инструменты для получения данных профилировщика и их размещения в этой форме? –

+0

Какую операционную систему вы хотите запустить? Кажется, что есть такие инструменты для Solaris и Mac OS X. –

+1

Претензии к выбору процентных соотношений, которые составляют до 100% :-) – templatetypedef

ответ

1

Это только Solaris, но dtrace может отслеживать практически все типы ввода-вывода, вкл/выкл CPU, время в определенных функциях, время сна и т. Д. Я не уверен, может ли он определять недостатки кэша, вы имеете в виду процессорный кэш - я не уверен, что эта информация предоставляется ЦП или нет.

+0

Также инструменты для Mac OS X могут это сделать - я думаю, что это может быть даже построено на DTrace. –

1

Просьба посмотреть at this и this.

Рассмотрите любые темы. В любой момент времени он что-то делает, и он делает это по какой-то причине, и медлительность может быть определена как время, которое он тратит на плохие причины - ему не нужно тратить время.

Сделайте снимок потока в определенный момент времени. Возможно, это в пропуске кеша, в инструкции, в инструкции, в функции, вызванной из инструкции вызова в другой функции, вызываемой из другой и т. Д., До call _main. У каждого из этих шагов есть причина, по которой раскрывается проверка кода.

  1. Если какой-либо из этих шагов не является очень веской причиной, и его можно избежать, этот момент времени не нужно тратить.

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

  1. Повторите предыдущий пункт 1.

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

Очень мало профилографов «получить». Те, которые делают, являются стек-пробоотборниками настенных часов, которые сообщают по строке кода (не по функции) процент времени активного (не количество времени, особенно не «самостоятельное» или «эксклюзивное» время.) это Zoom, и есть другие.

Глядя на то, где EIP висит, похоже на попытку рассказать время на часах только второй рукой. Функции измерения подобны попытке рассказать время на часах с отсутствием некоторых цифр.Профилирование только во время CPU, а не во время заблокированного времени, похоже на попытку рассказать время на часах, которые случайным образом перестают работать на длинных отрезках. Будучи обеспокоен точностью измерения, это похоже на попытку вовремя обедать.

Это не загадочная тема.

+0

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

+0

@ Элазар: Я считаю, что правильный ответ на вопрос состоит в том, чтобы подвергнуть сомнению помещение (легалистически :-). Предполагалось, что для того, чтобы знать, что делает программа большую часть времени, некоторые конкретные результаты полезны, и это то, что я задаю. Что касается метода, то нет классического метода. Выборка при вызове методов не является выборкой. (Это называется контрольно-измерительной аппаратурой.) Отбор проб должен быть некоррелирован с программным состоянием, потому что, если он коррелирован, он может легко пропустить большие проблемы (например, пропускать все IO, как вы видите с помощью gprof и профилировщика VS). Образец стека, наугад. –

+0

Майк, я имел в виду выборку, как в статистике. Вы измеряете состояние программы в какой-то момент. Инструментарий - это просто способ выборочной проверки вашей программы в неравномерном виде, этот http://goo.gl/3mSJ0 - еще один нестандартный способ его опробовать. Я говорю о том, что, хотя измерительная аппаратура не является выборочной выборкой равномерно, она достаточно часто проецирует вашу программу, так что эффективно вы будете иметь образец каждые, скажем, 2 мс, и, следовательно, он также может быть достаточно полезен. Вы узнаете, какие куски кода являются узким местом в вашей эффективной частоте дискретизации. Равномерная выборка лучше, но неравномерная выборка не бесполезна. –