in reply to Re: use vs. require in string eval?
in thread use vs. require in string eval?

There is practically no difference between the two. Your benchmark is flawed, here is a correction (only the addition of delete $INC{'CGI.pm'}; is required):
use Benchmark 'cmpthese'; use CGI(); undef %CGI::; delete $INC{'CGI.pm'}; cmpthese( shift, { use => sub { eval "use CGI();"; undef %CGI::; delete $INC{'CGI.pm'}; return (); }, require => sub { eval "require CGI;"; undef %CGI::; delete $INC{'CGI.pm'}; return (); }, }); __END__ $$ perl eval.use.v.eval.require.pl -3 Benchmark: running require, use, each for at least 3 CPU seconds... require: 3 wallclock secs ( 3.09 usr + 0.13 sys = 3.22 CPU) @ 37 +.28/s (n=120) use: 3 wallclock secs ( 3.06 usr + 0.17 sys = 3.23 CPU) @ 37 +.11/s (n=120) Rate use require use 37.1/s -- -0% require 37.3/s 0% -- $$ perl eval.use.v.eval.require.pl -5 Benchmark: running require, use, each for at least 5 CPU seconds... require: 5 wallclock secs ( 5.14 usr + 0.14 sys = 5.28 CPU) @ 37 +.31/s (n=197) use: 5 wallclock secs ( 5.05 usr + 0.25 sys = 5.30 CPU) @ 37 +.19/s (n=197) Rate use require use 37.2/s -- -0% require 37.3/s 0% -- $$ perl eval.use.v.eval.require.pl 50 Benchmark: timing 50 iterations of require, use... require: 1 wallclock secs ( 1.30 usr + 0.03 sys = 1.33 CPU) @ 37 +.65/s (n=50) use: 1 wallclock secs ( 1.31 usr + 0.03 sys = 1.34 CPU) @ 37 +.23/s (n=50) Rate use require use 37.2/s -- -1% require 37.7/s 1% -- $$ perl eval.use.v.eval.require.pl 100 Benchmark: timing 100 iterations of require, use... require: 3 wallclock secs ( 2.61 usr + 0.06 sys = 2.67 CPU) @ 37 +.41/s (n=100) use: 2 wallclock secs ( 2.63 usr + 0.05 sys = 2.67 CPU) @ 37 +.43/s (n=100) Rate require use require 37.4/s -- -0% use 37.4/s 0% -- $$

MJD says "you can't just make shit up and expect the computer to know what you mean, retardo!"
I run a Win32 PPM repository for perl 5.6.x and 5.8.x -- I take requests (README).
** The third rule of perl club is a statement of fact: pod is sexy.

Replies are listed 'Best First'.
Re: Re: Re: use vs. require in string eval?
by perrin (Chancellor) on Mar 12, 2004 at 13:59 UTC
    I was under the impression that the module being discussed was going to run the eval "require $foo" statement many times, even for modules it had already loaded. Looking at the code, it actually only does it once when you add a new type, so it is acting more like your benchmark than mine.
Re: Re: Re: use vs. require in string eval?
by andreychek (Parson) on Mar 12, 2004 at 16:53 UTC

    I hear what you're saying, but I'm having trouble arguing with the results I've seen :-)

    Indeed, my test case was trivial -- it launched, performed the application initialization, did some trivial tasks, and quit.

    I was testing this with OpenPlugin, which internally makes use of Class::Factory. So, when OpenPlugin starts up, it calls Class::Factory's add_factory_type for each plugin (in my test case, that included 7 plugins). Each plugin then loads it's driver, and each driver in turn loads it's dependencies. So off the top of my head, let's say add_factory_type ends up loading roughly 20 modules.

    And this is where I'm saying I saw the performance difference. I did not benchmark this per se, I profiled it. Using Devel::Profile, I realized that my app was spending quite a bit of time in add_factory_type, where it would be loading all these modules.

    I ran that several times, and found the results to be consistent -- each call to add_factory_method was taking about 0.010652 seconds per call. Changing the code within add_factory_type to use "use" instead of "require" lowered the execution time of that method to about 0.000904 seconds per call, and lowered the overall execution time of the application.

    If I change it back to "require", the execution time for the entire app goes back up.

    Could there be something with OpenPlugin, perhaps the amount of modules it ends up loading, or maybe even something in one of the modules that it's loading, that has it showing different results than what one might expect?

    Thanks for your thoughts. Have a good one,

    -Eric


    --
    Lucy: "What happens if you practice the piano for 20 years and then end up not being rich and famous?"
    Schroeder: "The joy is in the playing."
      Most likeley, the problem is in Devel::Profile. Try Time::HiRes or Benchmark instead and see if it says the same thing.

      It seems unlikely that 7 calls which each take 0.011 seconds would even be noticeable. Are you actually seeing a difference, or just going on numbers you get from Devel::Profiler? Also, are these numbers actual time or are they CPU time?