I had been investigating into ways to make test runs run faster, and I found that one of the biggest bottlenecks on my test machine was useless repetitive calls to apxs. The following patch caches apxs queries.
For instance, timings for mod_perl test run:
+ Before:
Files=218, Tests=2512, 1032 wallclock secs (594.94 cusr + 431.33 csys = 1026.27 CPU)
+ After:
Files=218, Tests=2512, 246 wallclock secs (196.69 cusr + 33.55 csys = 230.24 CPU)
-- -------------------------------------------------------------------------------- Philippe M. Chiasson m/gozer\@(apache|cpan|ectoplasm)\.org/ GPG KeyID : 88C3A5A5 http://gozer.ectoplasm.org/ F9BF E0C2 480E 7680 1AE5 3631 CB32 A107 88C3A5A5
Index: perl-framework/Apache-Test/lib/Apache/TestConfig.pm =================================================================== RCS file: /home/cvs/httpd-test/perl-framework/Apache-Test/lib/Apache/TestConfig.pm,v retrieving revision 1.244 diff -u -I$Id -r1.244 TestConfig.pm --- perl-framework/Apache-Test/lib/Apache/TestConfig.pm 5 Sep 2004 16:30:30 -0000 1.244 +++ perl-framework/Apache-Test/lib/Apache/TestConfig.pm 16 Sep 2004 17:46:54 -0000 @@ -1620,20 +1620,27 @@ sub apxs { my($self, $q, $ok_fail) = @_; return unless $self->{APXS}; - local @ENV{ qw(PATH IFS CDPATH ENV BASH_ENV) }; - my $devnull = devnull(); - my $apxs = shell_ready($self->{APXS}); - my $val = qx($apxs -q $q 2>$devnull); - chomp $val if defined $val; # apxs post-2.0.40 adds a new line - unless ($val) { - if ($ok_fail) { - return ""; + my $val; + unless (exists $self->{_apxs}{$q}) { + local @ENV{ qw(PATH IFS CDPATH ENV BASH_ENV) }; + my $devnull = devnull(); + my $apxs = shell_ready($self->{APXS}); + $val = qx($apxs -q $q 2>$devnull); + chomp $val if defined $val; # apxs post-2.0.40 adds a new line + if ($val) { + $self->{_apxs}{$q} = $val; } - else { - warn "APXS ($self->{APXS}) query for $q failed\n"; + unless ($val) { + if ($ok_fail) { + return ""; + } + else { + warn "APXS ($self->{APXS}) query for $q failed\n"; + return $val; + } } } - $val; + $self->{_apxs}{$q}; } sub pop_dir {