@@ -26,6 +26,15 @@ my $do_utf_tests = $] > 5.006;
2626my $better_than_56 = $] > 5.007;
2727# For debugging.
2828my $keep_files = grep /^--keep-files$/ , @ARGV ;
29+
30+ # Usage: perl -Mblib t/Constant.t --bench --memtest >/dev/null
31+ # Performance
32+ my $bench = grep /^--bench$/ , @ARGV ;
33+ # vs Memory usage
34+ my $memtest = grep /^--memtest$/ , @ARGV ;
35+ if ( $memtest and !can_run(" valgrind" ) ) {
36+ print " # valgrind not found. disabled --memtest\n " ;
37+ }
2938$| = 1;
3039
3140# Because were are going to be changing directory before running Makefile.PL
@@ -278,6 +287,30 @@ sub build_and_run {
278287 }
279288 }
280289
290+ if ($memtest ) {
291+ $maketest = " valgrind --tool=massif --massif-out-file=memtest \" $^X\" -Mblib test.pl" ;
292+ print " # make memcheck = '$maketest '\n " ;
293+ system " $maketest 2>/dev/null" ;
294+ open MASSIF, " memtest" ;
295+ my $mem_heap = 0;
296+ while (<MASSIF>) {
297+ my ($mem ) = ($_ =~ / ^mem_heap_B=(\d +)/ );
298+ $mem_heap = $mem if $mem and $mem > $mem_heap ;
299+ }
300+ close MASSIF;
301+ print STDERR " # memtest: $mem_heap \n " ;
302+ unlink " memtest" ;
303+ }
304+ if ($bench ) {
305+ require Time::HiRes;
306+ $maketest = " \" $^X\" -Mblib test.pl" ;
307+ print " # make bench = '$maketest '\n " ;
308+ my $t0 = [Time::HiRes::gettimeofday()];
309+ system $maketest ;
310+ my $time = Time::HiRes::tv_interval($t0 );
311+ print STDERR " # bench: $time \n " ;
312+ }
313+
281314 my $makeclean = " $make clean" ;
282315 print " # make = '$makeclean '\n " ;
283316 @makeout = ` $makeclean ` ;
@@ -362,6 +395,10 @@ sub write_and_run_extension {
362395
363396 my $c = tie *C, ' TieOut' ;
364397 my $xs = tie *XS, ' TieOut' ;
398+ my %options ;
399+ if ($wc_args and ref $wc_args -> [1]) {
400+ $options {$_ } = 1 for keys %{$wc_args -> [1]};
401+ }
365402
366403 ExtUtils::Constant::WriteConstants
367404 (C_FH => \*C,
@@ -391,7 +428,11 @@ sub write_and_run_extension {
391428 }
392429 };
393430
394- print " # $name \n # $dir /$subdir being created for $p_args ...\n " ;
431+ if ($bench or $memtest ) {
432+ print STDERR " # $name \n # $dir /$subdir being created for $p_args ...\n " ;
433+ } else {
434+ print " # $name \n # $dir /$subdir being created for $p_args ...\n " ;
435+ }
395436 mkdir $subdir , 0777 or die " mkdir: $! \n " ;
396437 chdir $subdir or die $! ;
397438
454495 print FH " \t $_ \n " foreach (@$export_names );
455496 print FH " );\n " ;
456497 # Print the AUTOLOAD subroutine ExtUtils::Constant generated for us
457- print FH autoload ($package , $] );
498+ print FH autoload ($package , $] ) unless $options { autoload } ;
458499 print FH " bootstrap $package \$ VERSION;\n 1;\n __END__\n " ;
459500 close FH or die " close $pm : $! \n " ;
460501
@@ -541,6 +582,11 @@ foreach my $args (@args)
541582{
542583 # Simple tests
543584 start_tests();
585+ my %options ;
586+ if ($args and ref $args -> [1]) {
587+ $options {$_ } = 1 for keys %{$args -> [1]};
588+ }
589+
544590 my $parent_rfc1149 =
545591 ' A Standard for the Transmission of IP Datagrams on Avian Carriers' ;
546592 # Test the code that generates 1 and 2 letter name comparisons.
@@ -563,6 +609,15 @@ foreach my $args (@args)
563609#define perl "rules"
564610EOT
565611
612+ if ($bench ) {
613+ for (0..500) {
614+ my $key = ' ' ;
615+ $key .= chr (ord (' A' )+int (rand (57))) for 0..3+int (rand (6));
616+ $key =~ s /\W // g ;
617+ $compass {$key } = int (rand (6));
618+ }
619+ }
620+
566621 while (my ($point , $bearing ) = each %compass ) {
567622 $header .= " #define $point $bearing \n "
568623 }
0 commit comments