in reply to Re: Improved regexp sought
in thread Improved regexp sought

I tested, and map is significantly faster than for or foreach at large numbers of iterations

I'm sorry, I know it's off-topic, but I'd really like to see the Benchmarks to back this statement up. It's not that I don't believe you, just that it would be really surprising to me if it were true.

Update: well, I am indeed surprised. Here's a benchmark I cooked up:

#!/usr/bin/perl use strict; use warnings; use Benchmark qw(cmpthese timethese); sub tp_map { my $i; my $pos = tell DATA; while (<DATA>) { chomp; chop; s/\?'/'/g; $i = 0; map { '['.$i++."]$_\n" } split(/\+/); } seek DATA, $pos, 0; } sub tp_for { my $i; my $pos = tell DATA; while (<DATA>) { chomp; chop; s/\?'/'/g; $i = 0; '['.$i++."]$_\n" for split(/\+/); } seek DATA, $pos, 0; } cmpthese timethese(-2, { tp_map => \&tp_map, tp_for => \&tp_for, }); __DATA__ 0010+2+O?'Reilly' 012+90+Penguin'

And here are the results:

Benchmark: running tp_for, tp_map for at least 2 CPU seconds... tp_for: 2 wallclock secs ( 1.92 usr + 0.18 sys = 2.10 CPU) @ 48 +185.71/s (n=101190) tp_map: 2 wallclock secs ( 1.90 usr + 0.17 sys = 2.07 CPU) @ 52 +882.61/s (n=109467) Rate tp_for tp_map tp_for 48186/s -- -9% tp_map 52883/s 10% --

Which shows that map is indeed faster for something like this. Of course, the rates for both are still quite high, and actually choosing between map and for based on speed seems silly, but I'm still surprised.

Replies are listed 'Best First'.
Re^3: Improved regexp sought
by ihb (Deacon) on Oct 28, 2004 at 08:47 UTC

    For me, for is faster on one Perl, and slower on another. The lesson learned is that optimizations like this is version dependant and not something you should bother about when trying to speed up your program.

    Benchmark: running tp_for, tp_map for at least 2 CPU seconds... tp_for: 2 wallclock secs ( 1.81 usr + 0.24 sys = 2.05 CPU) @ 11 +155.46/s (n=22891) tp_map: 3 wallclock secs ( 1.96 usr + 0.23 sys = 2.19 CPU) @ 10 +615.60/s (n=23280) Rate tp_map tp_for tp_map 10616/s -- -5% tp_for 11155/s 5% -- This is perl, v5.8.0 built for MSWin32-x86-multi-thread
    Benchmark: running tp_for, tp_map for at least 2 CPU seconds... tp_for: 2 wallclock secs ( 2.02 usr + 0.28 sys = 2.30 CPU) @ 35 +695.65/s (n=82100) tp_map: 2 wallclock secs ( 1.80 usr + 0.30 sys = 2.10 CPU) @ 39 +710.48/s (n=83392) Rate tp_for tp_map tp_for 35696/s -- -10% tp_map 39710/s 11% -- This is perl, v5.8.4 built for i486-linux

    ihb

    See perltoc if you don't know which perldoc to read!
    Read argumentation in its context!