Я разрабатываю плагин для стороннего хост-приложения на OSX, используя С++. Он скомпилирован как .dylib. Я хочу профилировать свой плагин, когда он работает в хост-приложении.
К сожалению, хост вызывает код плагина со скоростью, которая зависит от (последнего) времени выполнения плагина. Это означает, что общее время процесса может значительно отличаться от реального времени. Таким образом, с профилировщиком выборки «время, затраченное» на плагин, на самом деле не связано ни с чем полезным, поскольку оно сравнивается только с кадрами стека, которые попадают в процесс. Если я улучшу производительность плагина, то шаблон выполнения плагина хостом изменится соответственно, и будет очень сложно измерить улучшения в плагине.
Я могу использовать инструменты, но, насколько я могу судить, я могу получить только относительное время по отношению к процессорному времени процесса.
Я использовал dtrace для получения гистограммы пользовательского стека хост-процесса:
#!/usr/sbin/dtrace -s
#pragma ustackframes 100
#pragma D option quiet
/* $1 is pid */
/* $2 is sample rate in Hz (e.g. 100) */
/* $3 is duration (e.g. '20s') */
profile-$2
/pid == $1 && arg1/
{
@[ustack()] = count();
}
tick-$3
{
exit(0);
}
Это работает, но по-прежнему предоставляет выборки только относительно времени процесса, поскольку предикат сопоставляется только тогда, когда процесс находится в пользовательском пространстве. Даже удаление условия && arg1
для его запуска во время вызовов ядра процесса на самом деле не помогает.
Что я действительно хочу знать, так это то, сколько profile-n
образцов привело к тому, что процесс вообще не запустился. Затем я могу сравнить число в моем плагине с общим количеством образцов и получить абсолютные значения образцов для функций моего плагина. Это заставляет меня задаться вопросом: можно ли предположить, что запрошенная частота дискретизации profile-n
соблюдается? Могу ли я просто взять время * частоту дискретизации и использовать ее для расчета времени «вне процесса»? Я предположил, что, скажем, на частоте 1500 Гц он отбрасывал сэмплы и работал с какой-то другой, неизвестной частотой, но если я могу быть уверен, что это сэмплирование на частоте 1500 Гц, то я могу определить время «вне процесса».
В качестве альтернативы, существует ли известный способ профилирования настенных часов с помощью dtrace?