perl-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Randy Kobes <ra...@theoryx5.uwinnipeg.ca>
Subject [mp2] speeding up perl Makefile.PL
Date Thu, 23 Dec 2004 21:56:34 GMT
On an old (slow) machine I have, 'perl Makefile.PL'
takes a long time. By inserting some debug statements:
========================================================
Index: lib/Apache/Build.pm
===================================================================
--- lib/Apache/Build.pm	(revision 123223)
+++ lib/Apache/Build.pm	(working copy)
@@ -180,7 +180,7 @@
             $val = '';
         }
     }
-
+    warn "Setting $query_key -> $val\n";
     $self->{$query_key} = $val;
 }

@@ -735,7 +735,7 @@
 sub build_config {
     my $self = shift;
     my $bpm_mtime = 0;
-
+    warn "calling build_config\n";
     $bpm_mtime = (stat $INC{$bpm})[9] if $INC{$bpm};

     if (-e "lib/$bpm" and (stat _)[9] > $bpm_mtime) {

============================================================
there were a couple of things that arose:
==========================================================
Configuring Apache/2.0.52 mod_perl/1.99_19-dev Perl/v5.8.6
Setting APXS_APR_BINDIR -> /opt/httpd/bin
Setting APXS_BINDIR -> /opt/httpd/bin
calling build_config
calling build_config
calling build_config
calling build_config
calling build_config
Setting APXS_MPM_NAME -> prefork
Setting APXS_APU_BINDIR -> /opt/httpd/bin
calling build_config
Setting APXS_APU_BINDIR -> /opt/httpd/bin
calling build_config
Setting APXS_EXTRA_CFLAGS -> -g -O2 -pthread
calling build_config
Setting APXS_EXTRA_CPPFLAGS -> -DLINUX=2 -D_REENTRANT -D_XOPEN_SOURCE=500 -D_BSD_SOURCE
-D_SVID_SOURCE -D_GNU_SOURCE
calling build_config
Setting APXS_EXTRA_CPPFLAGS -> -DLINUX=2 -D_REENTRANT -D_XOPEN_SOURCE=500 -D_BSD_SOURCE
-D_SVID_SOURCE -D_GNU_SOURCE
[   info] generating script t/TEST
[ .... ]
calling build_config
Setting APXS_APU_BINDIR -> /opt/httpd/bin
calling build_config
Setting APXS_EXTRA_CFLAGS -> -g -O2 -pthread
calling build_config
Setting APXS_EXTRA_CPPFLAGS -> -DLINUX=2 -D_REENTRANT -D_XOPEN_SOURCE=500 -D_BSD_SOURCE
-D_SVID_SOURCE -D_GNU_SOURCE
calling build_config
Setting APXS_EXTRA_CPPFLAGS -> -DLINUX=2 -D_REENTRANT -D_XOPEN_SOURCE=500 -D_BSD_SOURCE
-D_SVID_SOURCE -D_GNU_SOURCE
calling build_config
calling build_config
calling build_config
calling build_config
calling build_config
calling build_config
calling build_config
calling build_config
calling build_config
calling build_config
calling build_config
calling build_config
calling build_config
calling build_config
calling build_config
calling build_config
calling build_config
calling build_config
calling build_config
calling build_config
Writing Makefile for ModPerl::Registry
Setting APXS_APU_BINDIR -> /opt/httpd/bin
calling build_config
Setting APXS_EXTRA_CFLAGS -> -g -O2 -pthread
calling build_config
Setting APXS_EXTRA_CPPFLAGS -> -DLINUX=2 -D_REENTRANT -D_XOPEN_SOURCE=500 -D_BSD_SOURCE
-D_SVID_SOURCE -D_GNU_SOURCE
calling build_config
Setting APXS_EXTRA_CPPFLAGS -> -DLINUX=2 -D_REENTRANT -D_XOPEN_SOURCE=500 -D_BSD_SOURCE
-D_SVID_SOURCE -D_GNU_SOURCE
calling build_config
calling build_config
calling build_config
calling build_config
calling build_config
Setting APXS_APU_BINDIR -> /opt/httpd/bin
calling build_config
Setting APXS_EXTRA_CFLAGS -> -g -O2 -pthread
calling build_config
Setting APXS_EXTRA_CPPFLAGS -> -DLINUX=2 -D_REENTRANT -D_XOPEN_SOURCE=500 -D_BSD_SOURCE
-D_SVID_SOURCE -D_GNU_SOURCE
calling build_config
Setting APXS_EXTRA_CPPFLAGS -> -DLINUX=2 -D_REENTRANT -D_XOPEN_SOURCE=500 -D_BSD_SOURCE
-D_SVID_SOURCE -D_GNU_SOURCE
[ ... ]
=================================================================
One is that "build_config" is called numerous times, and the
other is that various apxs queries are getting set numerous
times (ie, are not being cached within the apxs sub of
Apache::Build).

I tried the following diff:
====================================================================
Index: lib/Apache/Build.pm
===================================================================
--- lib/Apache/Build.pm	(revision 123213)
+++ lib/Apache/Build.pm	(working copy)
@@ -152,7 +152,7 @@
     my $query_key;
     if ($is_query) {
         $query_key = 'APXS_' . uc $_[1];
-        if ($self->{$query_key}) {
+        if (defined $self->{$query_key}) {
             return $self->{$query_key};
         }
     }
@@ -185,19 +185,28 @@
 }

 sub apxs_cflags {
-    my $cflags = __PACKAGE__->apxs('-q' => 'CFLAGS');
+    my $self = shift;
+    my $ref = ($self and ref($self) eq __PACKAGE__) ? $self : '';
+    my $who = $ref ? $self : __PACKAGE__;
+    my $cflags = $who->apxs('-q' => 'CFLAGS');
     $cflags =~ s/\"/\\\"/g;
     $cflags;
 }

 sub apxs_extra_cflags {
-    my $flags = __PACKAGE__->apxs('-q' => 'EXTRA_CFLAGS');
+    my $self = shift;
+    my $ref = ($self and ref($self) eq __PACKAGE__) ? $self : '';
+    my $who = $ref ? $self : __PACKAGE__;
+    my $flags = $who->apxs('-q' => 'EXTRA_CFLAGS');
     $flags =~ s/\"/\\\"/g;
     $flags;
 }

 sub apxs_extra_cppflags {
-    my $flags = __PACKAGE__->apxs('-q' => 'EXTRA_CPPFLAGS');
+    my $self = shift;
+    my $ref = ($self and ref($self) eq __PACKAGE__) ? $self : '';
+    my $who = $ref ? $self : __PACKAGE__;
+    my $flags = $who->apxs('-q' => 'EXTRA_CPPFLAGS');
     $flags =~ s/\"/\\\"/g;
     $flags;
 }
Index: lib/ModPerl/BuildMM.pm
===================================================================
--- lib/ModPerl/BuildMM.pm	(revision 123199)
+++ lib/ModPerl/BuildMM.pm	(working copy)
@@ -44,9 +44,11 @@
     q{-e "ModPerl::MM::install({@ARGV},'$(VERBINST)',0,'$(UNINST)');"}."\n";
 }

+my $build;
+
 sub build_config {
     my $key = shift;
-    my $build = Apache::Build->build_config;
+    $build ||= Apache::Build->build_config;
     return $build unless $key;
     $build->{$key};
 }
@@ -68,7 +70,7 @@
 sub WriteMakefile {
     my %args = @_;

-    my $build = build_config();
+    $build ||= build_config();
     ModPerl::MM::my_import(__PACKAGE__);

     my $inc = $build->inc;
@@ -133,7 +135,7 @@

 sub ModPerl::BuildMM::MY::constants {
     my $self = shift;
-    my $build = build_config();
+    $build ||= build_config();

     #install everything relative to the Apache2/ subdir
     if ($build->{MP_INST_APACHE2}) {
@@ -301,7 +303,7 @@

 sub ModPerl::BuildMM::MY::post_initialize {
     my $self = shift;
-    my $build = build_config();
+    $build ||= build_config();
     my $pm = $self->{PM};

     while (my($k, $v) = each %PM) {
@@ -343,10 +345,12 @@
     '';
 }

+my $apr_config;
+
 sub ModPerl::BuildMM::MY::libscan {
     my($self, $path) = @_;

-    my $apr_config = build_config()->get_apr_config();
+    $apr_config ||= $build->get_apr_config();

     if ($path =~ m/(Thread|Global)Mutex/) {
         return unless $apr_config->{HAS_THREADS};

==============================================================
which seems to minimize the calls to build_config(), and
also seems to use the cached apxs calls more. There's a
few things going on in this diff:

- within ModPerl::BuildMM, call build_config() only
if $build isn't defined;
- in Apache::Build, change the apxs_cflags, etc to call
apxs as a method on $self, if it was invoked this way, so
that the value can be stuffed into $self;
- in the apxs sub of Apache::Build, return
$self->{$query_key} only if it's defined.

On my slow machine, this speeds up 'perl Makefile.PL' by a
factor of 4. However, I'm unsure of some of these,
especially within ModPerl::BuildMM of avoiding the calls to
build_config().

-- 
best regards,
randy

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@perl.apache.org
For additional commands, e-mail: dev-help@perl.apache.org


Mime
View raw message