如何使用Perl NYTProf生成简洁的行级耗时统计文本报告
解决方案
方法1:直接使用NYTProf自带的命令行工具
你完全不需要生成HTML报告,NYTProf自带的nytprofstats工具原生支持命令行输出行级耗时统计:
- 执行如下命令即可直接得到按耗时从高到低排序的行级统计结果:
nytprofstats -l nytprof.out
输出内容默认就包含函数名、行号、总耗时、耗时占比字段,你可以用grep、awk简单过滤就能得到你要的格式,示例过滤命令:
nytprofstats -l nytprof.out | awk '{print $1":"$2" "$5}' | head -20
方法2:通过CSV导出自定义格式
如果需要更灵活的格式调整,可以用nytprofcsv导出结构化数据后自行处理:
- 生成CSV格式的统计文件:
nytprofcsv nytprof.out
- 生成的
nytprof_line.csv中包含所有行级耗时数据,你可以用任意文本处理工具排序、筛选得到你要的输出,示例:
awk -F ',' 'NR>1 {print $3":"$4" "sprintf("%.1f%%", $7*100)}' nytprof_line.csv | sort -k2 -nr
方法3:调用NYTProf API自定义脚本
如果上面两种都不符合你的格式要求,可以写个十几行的Perl脚本直接读取分析结果,示例代码:
use Devel::NYTProf::Data; my $profile = Devel::NYTProf::Data->new({filename => 'nytprof.out'}); my %line_times; for my $file ($profile->all_files) { my $line_stats = $profile->file_line_stats($file); for my $line (keys %$line_stats) { my $time = $line_stats->{$line}{time}; my $sub = $line_stats->{$line}{subname} || 'main'; $line_times{"$sub:$line"} = $time; } } my $total_time = $profile->attribute('total_time'); for my $key (sort {$line_times{$b} <=> $line_times{$a}} keys %line_times) { printf "%s\t%.1f%%\n", $key, $line_times{$key}/$total_time*100; }
运行这个脚本就能直接输出你要的按耗时降序排列的统计结果。
内容的提问来源于stack exchange,提问作者Walt Howard
相关产品推荐
相关产品推荐

