4

在我的应用程序中,我有多个进程。最初,我通过运行 .pl 文件启动一个 Perl 进程,然后它又调用另外两个 .pl 脚本创建 2 个新进程。如何使用 Profile 这样的代码。我做了 NYTProf,合并结果并用 html 打开,但所有与函数相关的分析信息都丢失了。配置此类应用程序的信息会有所帮助吗?

4

2 回答 2

5

文档的PROFILING 部分给出了一个示例:

PERL5OPT=-d:NYTProf

当您无法更改用于运行要分析的脚本的 perl 命令行时,这也非常方便。通常,您需要启用“addpid=1”选项以确保任何对 perl 的嵌套调用都不会覆盖配置文件。

addpid 选项的文档解释说:

将当前进程 ID 附加到文件名的末尾。这避免了并发或连续的进程覆盖同一个文件。如果在分析期间检测到分叉,则子进程将自动将进程 ID 添加到文件名中。

你说你“合并了结果”。我想你的意思是使用nytprofmerge。这应该只用于合并由完全相同的源代码生成的多个结果文件。例如,通过分叉创建子进程的进程,或多次运行未更改的脚本。在您的情况下,您正在从不同的脚本生成配置文件,因此每个配置文件输出应该用于生成单独的报告而不合并。

您说“缺少与功能相关的所有分析信息”。在我可以帮助您之前,我需要更多关于您如何分析代码和生成报告的详细信息。

于 2015-10-15T19:34:37.303 回答
0

补充@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
于 2019-05-22T13:44:13.863 回答