[Israel.pm] for vs map

Yossi Itzkovich Yossi.Itzkovich at ecitele.com
Sun Jun 29 23:10:46 PDT 2008


Hi,

In "Perl Best Practices" by Damian Conway  I saw a guideline  called "Use map instead of for when generating new lists from old". He explains there very well ,why map() will run faster then simple for when you generate new list from old one, for example:  map is written in c, knows the final array size from the beginning (assuming you return a scalar from the mapping code) and more.

I tried  the code below on Solaris with (perl 5.6.1 and 5.8 ) and Linux (perl 5.10) and got results that map is slower 10-40% than simple for.
Can someone explains it ?

The code:
#! /bin/env perl

use strict;
use warnings;
use Benchmark qw(cmpthese);

my @results=( 1 .. 100000);

sub simpleFor
  {
    my @sqrt_results;
    for my $result (@results)
      {
        push @sqrt_results, sqrt($result);
      }
  }


sub optimizedFor
  {
     my @sqrt_results;

    # Preallocate as many elements as @results already has...
    $#sqrt_results = $#results;

    for my $next_sqrt_result (0..$#results) {

        $sqrt_results[$next_sqrt_result] = sqrt $results[$next_sqrt_result];
    }
  }

sub usingMap
  {
    my @sqrt_results = map { sqrt $_ } @results;
  }


cmpthese (100,
          {"simple for" => 'simpleFor();',
           "optimized for" => 'optimizedFor()',
           "with map" => 'usingMap()',
          }
         );







More information about the Perl mailing list