我有一个运行约30分钟的Perl脚本,所以当然我运行Devel :: NYTProf.伟大的探究者.对于我的很多潜艇,我得到的一些数据对我来说没有意义.
我使用默认的NYTProf设置在Linux上使用perl 5.10.0运行.
在HTML输出中,每个subs都有一个摘要部分,说明在子及其子项中花费了多少时间,然后继续给我行信息.
行统计信息不会累计到函数中的总花费.是什么赋予了?
例如,我有一个报告使用233s(57 + 166)的功能.逐行编号报告有一行使用20s,另一行使用4,一行使用2.其他行<1s且函数不长.
我该怎么做才能解决这种不匹配问题?
我可以转到Perl 5.12,但这需要一些工作来安装依赖项.我很高兴以较慢的模式运行它.有没有办法增加采样频率?在较慢的机器上运行?
点击这里获取样品:我的NYTProf输出.在这种情况下,报告子使用225秒,但添加所有数字产生56秒.此次运行已关闭优化:
setenv NYTPROF optimize=0:file=nytprof.optout
Run Code Online (Sandbox Code Playgroud)
更新我使用findcaller = 1选项标记重新运行Perl 5.12,建议或多或少相同的结果.(我运行了不同的数据集)
更新 Tim B是对的.我已经更改了一些关键子设备来自行缓存,而不是使用memoize,NYTProf结果再次有用.谢谢蒂姆.
我刚刚将它添加到NYTProf文档中:
= head2如果语句和子例程计时不匹配
NYTProf有两个分析器:当perl从一个perl语句移动到另一个perl语句时调用的语句分析器,以及perl调用或从子例程返回时调用的子程序分析器.
子程序的各个语句时序通常加起来略小于子程序的独占时间.这是因为子程序调用和返回开销的处理包含在子程序的独占时间中.差异可能只是一个新的微秒,但对于被称为数十万次的子程序而言可能会变得明显.
语句分析器会跟踪在开销上花费的时间,例如将语句配置文件数据写入磁盘.子程序分析器减去在进入和离开子程序之间累积的开销,以便给出更准确的分布.语句分析器通常非常快,因为大多数写入都被缓冲用于zip压缩,因此每个语句的分析器开销往往非常小,通常是单个'tick'.结果是累积的开销非常嘈杂.对于经常调用且速度很快的子程序,这变得更加重要.这可能是对陈述时间和独家时间之间差异的另一个较小的贡献.
这可能解释了语句时间列之和(31.7s)与子程序报告的独占时间(57.2s)之间的差异.每次通话的差异大约为100微秒(这似乎有点高,但并非不合理).
语句分析器会跟踪在开销上花费的时间,例如将语句配置文件数据写入磁盘.子程序分析器减去进入和离开子程序之间的开销差异,以便提供更准确的分布.
语句分析器通常非常快,因为大多数写入都被缓冲用于zip压缩,因此每个语句的分析器开销往往非常小,通常是单个'tick'.结果是累积的开销非常嘈杂.对于频繁调用且速度很快的子程序(在这种情况下250303调用899μs/调用),这变得更加重要.所以我怀疑这是对声明时间和独家时间之间差异的另一个较小的贡献.
更重要的是,我还添加了这一部分:
= head2如果标题子例程计时与被叫子计划不匹配
报告的总体子程序时间标题为"花费10秒(2 + 8)......".在这个例子中,在子程序中花费了10秒("包含时间"),其中8秒花费在这个子程序调用的子程序中.这留下2秒作为子程序代码本身所花费的时间("独占时间",有时也称为"自我时间").
该报告显示子例程的源代码.调用其他子例程的行使用在这些调用中花费的时间的详细信息进行注释.
有时,子程序中的代码行调用的次数总和小于标题中报告的包含独占时间(上例中的10-2 = 8秒).
这里发生的是调用其他子程序,但NYTProf无法正确确定调用位置,因此调用不会在报告中出现在正确的位置.
使用旧版本的perl是一个原因(见下文).另一个是调用通过"goto⊂"退出的子程序. - 使用Memoize模块在AUTOLOAD subs和代码中经常遇到的问题.
通常,整个子例程时序是准确的,并且应该比语句或嵌套子调用时序的总和更可信.
Memoize模块是导致报告中出现差异的主要原因.调用 Memoize::__ANON__[...]执行Memoize生成的子看起来像sub { unshift @_, $cref; goto &_memoizer; }.这goto &_memoizer是由perl实现的,作为对调用者的一种返回,然后调用指定的子,这就是NYTProf对它进行配置的方式.
这种混淆的原因在于,虽然add_bit_to_map被记录为呼叫_memoizer时间的呼叫者,但呼叫的时间被添加到呼叫中,因此呼叫add_bit_to_map的文件和线路号位置被记录为goto.
在将来的版本中可能会改进这一点.
感谢您提示我对此进行调查并改进文档.
蒂姆·邦斯
ps我建议在邮件列表上询问有关NYTProf的问题.
| 归档时间: |
|
| 查看次数: |
721 次 |
| 最近记录: |