Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl-Sensitive Sunglasses
 
PerlMonks  

Re: Benchmarks for module compilation time

by simonm (Vicar)
on Jul 20, 2005 at 01:40 UTC ( #476333=note: print w/ replies, xml ) Need Help??


in reply to Benchmarks for module compilation time

Very nice, thanks!

How would you feel about posting your benchmarking code so we can try this on other platforms?


Comment on Re: Benchmarks for module compilation time
Re^2: Benchmarks for module compilation time
by itub (Priest) on Jul 20, 2005 at 02:32 UTC
    There was not really code as such, just a quick and dirty series of shell commands. It went something like this:
    #!/bin/bash modules="Archive::Tar Archive::Zip CGI Class::DBI DBI Data::Dumper Lin +gua::EN::Inflect Math::Trig POSIX Template XML::SAX XML::Simple YAML +diagnostics strict warnings" export TIMEFORMAT="%R" rm -f table for m in $modules; do time perl -M$m -e1; for i in `seq 1 10`; do time perl -M$m -e1; done &> $m echo -ne "$m\t" >> table awk '{t+=$1} END{print t/10}' $m >> table done sort -k2 -rn table > table.sorted
    The part that computes "all" and "none" is left as an exercise to the reader. ;-)

    I hope I won't be downvoted for using shell instead of Perl! ;-) Sadly, this makes the test less portable.

      Hm, it wouldn't be very hard to do this with Perl. I can think of two approaches: either invoke perl via system(), or use string-based eval.

      The following can be used like:
      # this_script.pl [--eval] [--perl /my/perl/interpreter] module module2 module3

      use strict; use warnings; use Time::HiRes; use Benchmark ':hireswallclock',':all'; use Getopt::Long; my $PERL = 'C:\\Perl\bin\perl.exe'; my $use_eval = 0; GetOptions ( 'perl=s' => \$PERL, 'eval' => \$use_eval ); my %testhash = map { $_ => ( $use_eval ? "eval 'use $_'" : "system('$PERL', '-M$_ ', '-e +1')" ) } @ARGV; timethese( ($use_eval ? 10000 : 1000), \%testhash );

      This one was created to work with ActiveState Perl on Windows. Pass the --perl parameter to use it on other platforms.

      Update:itub confirms my suspicions that eval isn't as accurate a test as the system route. Thanks for the explanation of why, itub! It's worth noting that the system call is the default approach in the code above.

      Updates:

      • 2005-07.Jul-26 : clarified preferred use of system over eval, thanks to itub

      <-radiant.matrix->
      Larry Wall is Yoda: there is no try{} (ok, except in Perl6; way to ruin a joke, Larry! ;P)
      The Code that can be seen is not the true Code
      "In any sufficiently large group of people, most are idiots" - Kaa's Law

        Thanks for the port. :) It's not that I wrote a shell script; it was all done interactively. What I posted here was a reconstruction from looking at the shell history.

        I don't think the 'eval' version is working properly, bacause the second time you call eval for the same module, it becomes effectively a no-op. You can make perl forget that it already included a module by deleting its entry from %INC (for example, delete $INC{'CGI.pm'}). That doesn't clean up the package, however, which sometimes leads to spurious warnings, and some modules may do strange things when their initialization code is run twice. It is trickier to delete the dependencies as well, to return to a "blank slate", but it should be possible. Maybe there's even a CPAN module for that. ;-)

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://476333]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others meditating upon the Monastery: (5)
As of 2014-08-30 23:26 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The best computer themed movie is:











    Results (294 votes), past polls