in reply to Re: Re: Re: to strict or not to strict
in thread to strict or not to strict
This is completely OT as far as this thread is concerned, and is totally meaningless (probably) anyway, but I'd dearly like an explaination anyway.
Reading tachyon's modified benchmark it struck me that if purely the load time was of interest, then the simple expedient of deleting a non-existant hash key probably didn't quite cut it when it came to removing the "administrative overhead" of use from the equation, so I modified it slightly to create and delete a key each time to see the effect that had.
The results are surprising, and somewhat confusing.
Pre-tye code
use Benchmark 'cmpthese'; my %hash = ( key => 'value' ); cmpthese( -10, { with => sub {delete $INC{strict.pm}; use strict 'refs'; my $ +a = 1; my $b = 2}, without => sub {$hash{key} = delete $hash{key}; my $a + = 1; my $b = 2}, } ); __END__ P:\test>P:\bin\perl.exe junk.pl8 Rate without with without 25587/s -- -79% with 121330/s 374% --
Post-tye correction
use Benchmark 'cmpthese'; my %hash = ( key => 'value' ); cmpthese( -3, { with => sub {delete $INC{'strict.pm'}; use strict 'refs'; my + $a = 1; my $b = 2}, without => sub {$hash{key} = delete $hash{key}; my +$a = 1; my $b = 2}, } ); __END__ P:\test>..\bin\perl.exe junk.pl8 Rate without with without 24308/s -- -82% with 136483/s 461% --
Which seemed to indicate that somehow, deleting a real key from %INC, opening, reading, closing strict.pm, compiling it with all that entails, and then adding the key back to %INC was hugely quicker than simply deleting a key from lexical hash and putting it back again?
Then it dawned on me that use is a compile time directive, so it will only be executed once regardless of how many times the code is executed. So, swapping use for a require and a call to it's import() routine, (is that roughly equivalent?) I got these results.
Pre-tye code
use Benchmark 'cmpthese'; my %hash = ( key => 'value' ); cmpthese( -3, { with => sub { delete $INC{strict.pm}; require 'strict.pm'; strict::import( 'refs' ); my $a = 1; my $b = 2 }, without => sub { $hash{key} = delete $hash{key}; my $a = 1; my $b = 2 }, } ); __END__ P:\test>P:\bin\perl.exe junk.pl8 Rate with without with 7281/s -- -71% without 24851/s 241% --
The biggy!! Post-tye correction.
use Benchmark 'cmpthese'; my %hash = ( key => 'value' ); cmpthese( -3, { with => sub { delete $INC{'strict.pm'}; require 'strict.pm'; strict::import( 'refs' ); my $a = 1; my $b = 2 }, without => sub { $hash{key} = delete $hash{key}; my $a = 1; my $b = 2 }, } ); __END__ P:\test>..\bin\perl.exe junk.pl8 Rate with without with 137/s -- -99% without 24226/s 17576% --
Which apart from the fact that tachyon's machine is about 20x quicker than mine, is a mildly interesting result. However, I'm not sure that I'm really comparing eggs with eggs, so I had another go.
This time, I thought I would force Benchmark to re-compile (eval) both snippets each time it exercised them, rather than just call a pre-compiled sub and I got these results.
Pre-tye code
use Benchmark 'cmpthese'; my %hash = ( key => 'value' ); cmpthese( -3, { with => q[ BEGIN{ delete $INC{strict.pm}; use strict 'refs' } my $a = 1; my $b = 2 ], without => q[ BEGIN{ $hash{key} = delete $hash{key} } my $a = 1; my $b = 2 ], } ); __END__ P:\test>P:\bin\perl.exe junk.pl8 Rate without with without 374581/s -- -0% with 375658/s 0% --
Post-tye corrected benchmark
use Benchmark 'cmpthese'; my %hash = ( key => 'value' ); cmpthese( -10, { with => q[ BEGIN{ delete $INC{'strict.pm'}; use strict 'refs' } my $a = 1; my $b = 2 ], without => q[ BEGIN{ $hash{'key'} = delete $hash{key} } my $a = 1; my $b = 2 ], } ); __END__ P:\test>..\bin\perl.exe junk.pl8 Rate with without with 368780/s -- -2% without 375558/s 2% -- P:\test>..\bin\perl.exe junk.pl8 Rate with without with 371638/s -- -1% without 374367/s 1% --
Which, without drawing any conclusions as I am still not particularly certain that I am really comparing eggs with eggs, is much closer to my real world experience of benchmarking complete programs with and without use strict.
Whenever I tried this before, I nearly always found that the differences were marginal, if detectable.
Did any of my attempts get closer to a real world test?
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^5: to strict or not to strict (use strict!)
by tye (Sage) on Oct 17, 2003 at 15:20 UTC | |
by BrowserUk (Patriarch) on Oct 17, 2003 at 15:34 UTC | |
|
Re: Re: Re: Re: Re: to strict or not to strict
by tachyon (Chancellor) on Oct 17, 2003 at 13:23 UTC | |
by BrowserUk (Patriarch) on Oct 17, 2003 at 14:54 UTC | |
|
Re: Re: Re: Re: Re: to strict or not to strict
by Anonymous Monk on Oct 17, 2003 at 13:38 UTC | |
by BrowserUk (Patriarch) on Oct 17, 2003 at 15:04 UTC | |
by Anonymous Monk on Oct 17, 2003 at 15:08 UTC |