in reply to Re^2: Benchmarks for module compilation time
in thread Benchmarks for module compilation time

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:

<-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

Replies are listed 'Best First'.
Re: Perl port?
by itub (Priest) on Jul 25, 2005 at 20:09 UTC

    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. ;-)