On Aug 3, 7:10 am, chas.ow...@gmail.com ("Chas. Owens") wrote: > On Tue, Aug 3, 2010 at 09:47, Chas. Owens <chas.ow...@gmail.com> wrote: > > On Tue, Aug 3, 2010 at 08:44, Shawn H Corey <shawnhco...@gmail.com> wrote: > >> On 10-08-03 06:43 AM, Rob Coops wrote: > > >>> Third you could of course when you are printing the values from the array > >>> add the linefeeds: > >>> print join("\n", @myarray); > >>> or > >>> foreach my $value ( @myarray ) { > >>> print $value . "\n"; > > >> When printing, use a list; it's faster. > > >> print $value, "\n"; > > snip > > > I hate it when some makes a blanket statement of "it's faster" without > > providing a benchmark or a reason. In the simple case, the comma is > > slower than the period and interpolation is slower still. > > Whoops, accidentally sent too early. My point was that even though > concatenation is faster than pass a list or an interpolated string > (contrary to the claim made earlier), it isn't really that much > faster. Especially once you factor in the cost of writing to disk > (which the benchmark avoids to prevent noise). Now, you might make > the argument that the comma is clearer than the concatenation, but > that point is debatable. For one thing, these two statements are not > identical: > > print "foo", "\n"; > print "foo" . "\n"; > > The first will be affected by the value of $, and the second won't. > The second will also benefit from compile time constant folding: > > perl -MO=Deparse -e 'print "foo" . "\n"' > print "foo\n"; > > perl -MO=Deparse -e 'print "foo", "\n"' > print 'foo', "\n"; > > Personally, I use string interpolation even though it is the slowest > of the three methods. I find string interpolation to be superior to > passing a list because it is not affected by $, and more readable than > having tiny periods floating around. It also requires fewer > characters on average (you usually have at least one set of double > quotes in the expression already).
I agree totally. > > To sum up: if you are looking for something like this to speed up your > program than you are well and truly hosed. Choose a method that looks > right to your team and has the right behavior. Profile your code to > find spots were you are slow and optimize those spots by changing the > algorithm or moving code down a level to C (via XS or Inline::C), not > by relying on folk-wisdom micro-optimizations. > > One item: > Rate string comma period > string 3588672/s -- -3% -11% > comma 3714590/s 4% -- -7% > period 4014817/s 12% 8% -- > > #!/usr/bin/perl > > use strict; > use warnings; > > use Benchmark; > > open my $bit_bucket, ">", "/dev/null" > or die "$!"; > > my $s = "foo"; > > my %subs = ( > string => sub { print $bit_bucket "$s\n" }, > comma => sub { print $bit_bucket $s, "\n" }, > period => sub { print $bit_bucket $s . "\n" }, > ); > > for my $sub (keys %subs) { > print "$sub: ", $subs{$sub}(), "\n"; > > } > > Benchmark::cmpthese -1, \%subs; > > Ten items: > Rate string comma period > string 1052183/s -- -1% -2% > comma 1061926/s 1% -- -1% > period 1071850/s 2% 1% -- > ... There was a recent thread about the slowness of concatenation on Win32 (can't remember, maybe a perl issue though). Adding a couple of small tweaks for Win32 and re-running seems to confirm: use File::Spec qw(devnull); open my $bit_bucket, ">", File::Spec->devnull() or die "$!"; ... Result: Rate period string comma period 453142/s -- -4% -6% string 469903/s 4% -- -2% comma 481771/s 6% 3% -- -- Charles DeRykus -- To unsubscribe, e-mail: beginners-unsubscr...@perl.org For additional commands, e-mail: beginners-h...@perl.org http://learn.perl.org/