我注意到,当我运行我的程序perl -MDevel::Cover=-silent,-nogcov foo.pl
以收集覆盖率信息foo.pl
时,我的程序部分会大幅减速,这些部分会派生和执行非 perl 程序,如tar
,gzip
或dpkg-deb
. 感谢这个问题,我想出了如何选择性地禁用 Devel::Cover,所以我现在正在写:
my $is_covering = !!(eval 'Devel::Cover::get_coverage()');
my $pid = fork();
if ($pid == 0) {
eval 'Devel::Cover::set_coverage("none")' if $is_covering;
exec 'tar', '-cf', ...
}
这样做,每次测试减少了 5 分钟的运行时间,对于 122 次测试,我节省了 10 小时的计算时间。
不幸的是,我不能总是将此 eval 语句添加到分叉的子进程中。例如,当我使用system()
. 我想避免将我的每个system()
调用都重写为手册fork/exec
。
有没有办法为我的分叉进程或基本上不是我的脚本的所有内容禁用 Devel::Cover foo.pl
?
谢谢!