如何为分叉的子进程禁用 Devel::Cover?

jos*_*sch 7 perl code-coverage devel-cover

我注意到,当我运行我的程序与perl -MDevel::Cover=-silent,-nogcov foo.pl收集覆盖率信息foo.pl,我从我的节目的部分越来越庞大的减速是fork和exec非Perl程序一样targzipdpkg-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

谢谢!

mob*_*mob 1

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)