Как написать простой профилировщик кода? - PullRequest
4 голосов
/ 28 июля 2011

Я хотел бы знать, как достигаются такие продукты, как quantify, для измерения затрат времени на функции / методы без изменения кода. Кто-нибудь знает?

У вас есть веб-страница с описанием того, как начать писать свой собственный инструмент?

Ответы [ 8 ]

1 голос
/ 28 июля 2011

Ненавязчивый профилировщик может скомпилировать код с помощью профилировщика в исполняемую форму. Этот формат не обязательно должен соответствовать фактическому формату выполнения, требуемому ОС. Это похоже на виртуальную машину Java.

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

Другие профилировщики модифицируют код для вызова «начала измерения» и «окончания измерения», где требуется профилирование (обычно в начале и в конце функций).

Отладчики JTAG и другие эмуляторы вызывают функции измерения при обнаружении определенных адресов.

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

0 голосов
/ 30 июля 2011

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

Конечно, это применимо только в специализированных случаях.

0 голосов
/ 30 июля 2011

Полезно помнить об этом:

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

Звучит очевидно, верно?Но обратите внимание:

  • Там написано locate , а не measure .Измерение может быть средством до конца определения местоположения, но на самом деле оно очень косвенное.
  • В нем говорится действия , а не функции / методы и не обязательно горячие точки .Чаще всего это пунктов вызова функций , которые стоят больше времени, чем ожидалось, и на самом деле это не нужно делать.
  • В его / ее коде написано .Это единственный код, который программист может изменить.Бесполезно осознавать, что в какой-то системной процедуре тратится много времени.
  • В нем говорится времени , а не процессорного времени .Если программа тратит значительный процент времени, заблокированного из-за ввода-вывода или других системных функций, это так же важно, как и время процессора.
  • В нем говорится: существенный процент , а не точновремя .Если находится дорогостоящее мероприятие, важно то, что оно находится, а не неопределенность того, насколько оно дорого.(Если вы охотитесь за золотыми самородками, вы сначала измеряете один, а затем находите его?)

Так что не любой старый сэмплер или инструментарий будет служить этой цели.

ИМХОто, что работает лучше всего, это то, что собирает сэмплы стека, а не только счетчик программы, и сэмплы в произвольное время настенного времени, а не только время процессора, и сообщает не только по функции, но и по строке кода, процент выборок, содержащихэта линия. Zoom - это такой профилировщик.

Другими словами a) Не берите большое количество маленьких выборок и собирайте их в числа.б) Сделайте небольшое количество больших выборок и поймите, что они вам говорят.

В качестве крайнего примера, если берутся всего три выборки из стека, если какое-то конкретное утверждение (или инструкция) появляется где-то надва из них, сколько стоит это заявление?Ну, это мыслимое это просто совпадение - ложный положительный результат, но в среднем , что сэкономит (2 + 1) / (3 + 2) = 60% от общего времени выполнения.С точки зрения "взрыва за доллар", это трудно победить.

Вот более подробное резюме проблем .

0 голосов
/ 28 июля 2011

Профилировщик может иметь следующие атрибуты:

  • Отладчик, который будет замечать события отладки в целевом процессе (например, создание потока, загрузка DLL, выход потока и т. Д.).
  • Процесс, который будет иметь набор хуков (хуков Windows, стандартных хуков вызовов функций и т. Д.), Которые будут использоваться для «профилирования».
  • Может также запускаться как служба, которая будет замечать события в ядре (ring0) уровень.Для этого может потребоваться или не потребоваться виртуализация оборудования из BIOS.
0 голосов
/ 28 июля 2011

Я не знаю насчет quatify, но один из частых приемов - использовать стохастическую выборку: прерывать каждые 100 микросекунд или около того и сохранять текущий указатель команды.Затем из таблицы символов определите, в какой функции они выполнялись, и суммируйте их.

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

0 голосов
/ 28 июля 2011

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

0 голосов
/ 28 июля 2011

Я предполагаю, что процессор переведен в "одноступенчатый режим".

0 голосов
/ 28 июля 2011

Вы задаете очень большой вопрос.Однако из того, что я видел, профилировщики во многих случаях модифицируют код.EQUATEC, например, создает копию ваших исполняемых файлов и библиотек, которые инструментированы.Другие будут создавать кэши и копии кода при запуске профилировщика.Таким образом, они не обязательно пишут какие-либо инструменты в код, с которым вы работаете, но они инструментируют копии кода или IL.

...