Инструментирование профилировщиков против сэмплирования

Я провожу исследование между профилировщиками, в основном инструментами и выборками. У меня появилась следующая информация:

  • выборка: остановить выполнение программы, взять компьютер и, таким образом, сделать вывод, где программа
  • инструментирование: добавьте в программу некоторый служебный код, чтобы он увеличивал некоторые указатели, чтобы узнать программу

Если приведенная выше информация неверна, поправьте меня.

После этого я смотрел на время исполнения, и некоторые говорили, что инструментирование занимает больше времени, чем семплирование! это правильно?

если да то почему? в выборке вы должны заплатить цену переключения контекста между процессами, в то время как в последнем вы в той же программе бесплатно

Я что-то упускаю?

ваше здоровье! знак равно


person Syntax_Error    schedule 12.01.2011    source источник
comment
Рассказывать о том, что делает программа, сэмплируя ПК, все равно, что пытаться определить время, сэмплируя только секунды. Применительно к реальному программному обеспечению обычно говорится, что программа где-то в ядре бессмысленна. Образцы стека более полезны, потому что они говорят почему он там. Инструментирование похоже на попытку определить время на часах, где несколько цифр стерты, как будто оно скачет с 2:00 до 7:00. Это потому, что он измеряет время функций, а не строк кода. Нажмите большую функцию, и вы вернулись к угадыванию.   -  person Mike Dunlavey    schedule 17.01.2011


Ответы (2)


Прерывания, генерируемые профилировщиком выборки, обычно добавляют незначительное количество времени к общему времени выполнения, если только у вас не очень короткий интервал выборки (например, ‹ 1 мс).

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

person Paul R    schedule 12.01.2011

Это зависит от того, насколько обычным вы хотите быть.

gprof делает обе вещи, о которых вы упомянули. Вот несколько комментариев по этому поводу.

Существует школа мысли, которая говорит, что профилирование — это измерение. Измерение чего? Ну что угодно - только мерить. Наряду с этим возникает идея, что вы хотите получить «общую картину» того, что происходит. Эта школа в основном рассматривает попытки найти «медленные функции», не определяя четко, что это вообще означает, и не предлагая вам искать там для оптимизации.

Другая школа говорит, что вы действительно отлаживаете. Вы хотите точно определить местонахождение ошибок определенного типа — таких, которые не делают программу неправильной, а занимают слишком много времени. Это не масштабные вещи. Это очень точные точки в коде, где происходит что-то, что требует гораздо больше времени, чем необходимо. На сколько больше - не важно. Важно то, что он расположен так, чтобы его можно было зафиксировать. С этой точки зрения накладные расходы на профилирование не имеют значения, равно как и точность измерения. Измерение предназначено для того, чтобы увидеть, сколько времени было сэкономлено.

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

Я учусь во второй школе, и вот пример того, что вы можете сделать с ним.

Вот более кратко обсуждение вопросов.

person Mike Dunlavey    schedule 12.01.2011