Как использовать NYTProf, когда есть несколько процессов

В моем приложении у меня несколько процессов. Первоначально я запускаю один процесс Perl, запустив файл.pl, он, в свою очередь, вызывает еще два сценария.pl, создающих 2 новых процесса. Как использовать профиль такого кода. Я сделал NYTProf, объединил результаты и открыл с помощью html, но все данные профилирования, относящиеся к функциям, отсутствуют. Информация для профиля такого рода приложений поможет?

1 ответ

Решение

В разделе ПРОФИЛИРОВАНИЕ документации приведен пример:

PERL5OPT = -d: NYTProf

Это также очень удобно, когда вы не можете изменить командную строку perl, используемую для запуска скрипта, который вы хотите профилировать. Обычно вы хотите включить опцию "addpid=1", чтобы любые вложенные вызовы perl не перезаписывали профиль.

Документы для опции addpid объясняют, что:

Добавьте идентификатор текущего процесса в конец имени файла. Это позволяет избежать одновременных или последовательных процессов перезаписи одного и того же файла. Если во время профилирования обнаруживается разветвление, то дочерний процесс автоматически добавляет идентификатор файла в имя файла.

Вы говорите, что "слили результаты". Я предполагаю, что вы имеете в виду использование nytprofmerge. Это следует использовать только для объединения нескольких файлов результатов, созданных с использованием одного и того же исходного кода. Например, процессом, который разветвил создание дочерних процессов, или несколькими запусками неизмененного сценария. В вашем случае вы генерируете профили из разных скриптов, поэтому каждый вывод профиля должен использоваться для создания отдельного отчета без слияния.

Вы говорите, что "вся информация профилирования, относящаяся к функциям, отсутствует". Мне нужно больше информации о том, как именно вы профилируете код и генерируете отчеты, прежде чем я смогу вам помочь.

В дополнение к ответу @TimBunce, вот пошаговое описание того, как я использовал addpid создать отчет (проверено в bash, с Devel::NYTProf 6.06).

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

# Clean any old output
rm -rf nytprof*

# Run the program with addpid=1.
#   `{1..10}` => ten runs
#   `foo.pl` => whatever your program name and other Perl options are
# This makes files `nytprof.out.####`, where `####` is the PID.
(export NYTPROF=addpid=1 ; for i in {1..10} ; do perl -d:NYTProf foo.pl ; done ; )    

# Merge the result files.  This produces `nytprof-merged.out`.
nytprofmerge -v nytprof.out.*

# Make the HTML report into `nytprof/`
nytprofhtml -f nytprof-merged.out
Другие вопросы по тегам