jos*_*sch 7 perl code-coverage devel-cover
我注意到,当我运行我的程序与perl -MDevel::Cover=-silent,-nogcov foo.pl收集覆盖率信息foo.pl,我从我的节目的部分越来越庞大的减速是fork和exec非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', ...
}
Run Code Online (Sandbox Code Playgroud)
这样做,每个测试减少了五分钟的运行时间,对于 122 个测试,我节省了 10 小时的计算时间。
不幸的是,我不能总是将此 eval 语句添加到分叉子进程中。例如,当我使用system(). 我想避免将每次system()调用都重写为手册fork/exec。
有没有办法为我的分叉进程或基本上所有不是我的脚本的进程禁用 Devel::Cover foo.pl?
谢谢!
Forks::Super有点重,但它具有分叉后回调的功能,该回调在每次分叉之后但在执行子进程中的任何其他代码之前执行。
use Forks::Super;
my $is_covering = !!(eval 'Devel::Cover::get_coverage()');
POSTFORK_CHILD {
# runs in every child process immediately after fork()
eval 'Devel::Cover::set_coverage("none")' if $is_covering;
};
...
Run Code Online (Sandbox Code Playgroud)