Как использовать 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