<?xml version="1.0" encoding="windows-1252"?>
<node id="1008370" title="Re^2: better array to hash conversion" created="2012-12-11 14:09:33" updated="2012-12-11 14:09:33">
<type id="11">
note</type>
<author id="961">
Anonymous Monk</author>
<data>
<field name="doctext">
&lt;p&gt; presize/preallocate buckets , change the number of elements, change the perl version, and the winner changes :)
&lt;p&gt; funny bench :) &lt;spoiler&gt;
&lt;c&gt;#!/usr/bin/perl --
use strict; use warnings;
use Benchmark qw/ cmpthese /;

#~ my $cmptime = -abs(shift);
#~ my $cmptime = -3;
my $cmptime = -10;
printf "%10s cmptime %s\n", $], $cmptime;
my @array;
for my $power ( 8, 16,18 ) {
#~ for my $power ( 8, 16, 20, 24 ){
    @array = 1 .. ( 2**$power );
    print "2 ** $power == @{[int @array ]}\n";
    cmpthese(
        $cmptime, {
            map { ; $_ =&gt; __PACKAGE__-&gt;can( $_ ) }
            qw/ ffor fforc
            ifor imap mmap
            sffor sfforc sifor simap
            slic smap simap2
            /
        }
    );
}
exit;

sub mmap {
    my %hash = map { ; $array[$_] =&gt; $_ } 0 .. $#array;
    ();
}

sub imap {
    my $ix = 0;
    my %hash = map { ; $_ =&gt; $ix++ } @array;
    ();
}
sub slic { my %hash; @hash{@array} = 0 .. $#array; (); }

sub ffor {
    my %hash;
    for my $ix ( 0 .. $#array ) { $hash{ $array[$ix] } = $ix; }
    ();
}

sub fforc {
    my %hash;
    for( my $ix = 0 ; $ix &lt; @array ; $ix++ ) { $hash{ $array[$ix] } = $ix; }
    ();
}

sub ifor {
    my %hash;
    my $ix = 0;
    $hash{$_} = $ix++ for @array;
    ();
}

## preSize
sub sffor {
    my %hash;
    keys( %hash ) = int @array;
    for my $ix ( 0 .. $#array ) { $hash{ $array[$ix] } = $ix; }
    ();
}

sub sfforc {
    my %hash;
    keys( %hash ) = int @array;
    for( my $ix = 0 ; $ix &lt; @array ; $ix++ ) { $hash{ $array[$ix] } = $ix; }
    ();
}

sub sifor {
    my %hash;
    my $ix = 0;
    keys( %hash ) = int @array;
    $hash{$_} = $ix++ for @array;
    ();
}

sub smap {
    my %hash;
    keys( %hash ) = int @array;
    @hash{@array} = 0 .. $#array;
    ();
}

sub simap {
    my $i = 0;
    my %hash;
    keys( %hash ) = int @array;
    %hash = map { $_ =&gt; $i++ } @array;
    ();
}


sub simap2 {
    my $i = 0;
    my %hash;
    keys( %hash ) = int @array;
    %hash = map(( $_ =&gt; $i++ ), @array);
    ();
}

__END__
&lt;/c&gt;&lt;/spoiler&gt;
&lt;p&gt; funny results :) &lt;spoiler&gt;
&lt;table&gt;&lt;tr valign=top&gt;&lt;td&gt;&lt;c&gt;
5.008008 c -10
2 ** 8 == 256
Rate simap2
simap2 2721/s
simap 2770/s
mmap 3196/s
imap 3505/s
fforc 3981/s
sffor 4335/s
sfforc 4535/s
ffor 4838/s
ifor 5027/s
sifor 5798/s
smap 8123/s
slic 9384/s


5.008008 c -10
2 ** 16 == 65536
Rate simap2
simap2 3.82/s
simap 3.83/s
mmap 4.53/s
imap 5.26/s
sffor 7.86/s
sfforc 7.89/s
fforc 8.09/s
smap 8.46/s
sifor 8.68/s
ffor 8.83/s
ifor 8.93/s
slic 9.47/s


5.008008 c -10
2 ** 18 == 2621443



Rate simap2
simap2 0.810/s
simap 0.825/s
mmap 0.979/s
imap 1.18/s
smap 1.68/s
sfforc 1.75/s
sffor 1.80/s
sifor 1.90/s
fforc 1.90/s
slic 1.93/s
ffor 2.08/s
ifor 2.10/s




&lt;/c&gt;&lt;/td&gt;&lt;td&gt;&lt;c&gt;
5.008009 c -10
2 ** 8 == 256
Rate simap
simap 1767/s
simap2 1775/s
mmap 2017/s
imap 2183/s
fforc 2980/s
sffor 3326/s
ffor 3389/s
ifor 3565/s
sfforc 4920/s
sifor 6445/s
smap 8908/s
slic 9698/s


5.008009 c -10
2 ** 16 == 65536
Rate mmap
mmap 2.36/s
simap2 2.37/s
simap 2.37/s
imap 2.51/s
sffor 5.77/s
fforc 6.03/s
ffor 6.42/s
ifor 6.53/s
sfforc 7.95/s
smap 8.75/s
sifor 8.83/s
slic 9.82/s


5.008009 c -10
2 ** 18 == 2621442


**too few iter
Rate imap
imap 0.187/s
mmap 0.259/s
simap2 0.298/s
simap 0.302/s
sffor 1.44/s
fforc 1.50/s
ffor 1.60/s
ifor 1.63/s
smap 1.68/s
sfforc 1.75/s
slic 1.91/s
sifor 1.92/s




&lt;/c&gt;&lt;/td&gt;&lt;td&gt;&lt;c&gt;
5.012002 c -10
2 ** 8 == 256
Rate mmap
mmap 1364/s
imap 1456/s
simap 1734/s
simap2 1742/s
fforc 3086/s
sffor 3224/s
ffor 3479/s
ifor 3551/s
sfforc 5073/s
sifor 6343/s
smap 8775/s
slic 9969/s


5.012002 c -10
2 ** 16 == 65536
Rate mmap
mmap 1.99/s
imap 2.01/s
simap 3.10/s
simap2 3.11/s
sffor 6.63/s
fforc 6.81/s
ffor 7.27/s
ifor 7.35/s
sfforc 9.58/s
sifor 10.5/s
smap 10.6/s
slic 12.1/s


5.012002 c -10
2 ** 18 == 2621442


**too few iter
Rate imap
imap 0.211/s
mmap 0.242/s
simap2 0.406/s
simap 0.409/s
sffor 1.67/s
fforc 1.75/s
ffor 1.85/s
ifor 1.89/s
sfforc 2.11/s
smap 2.11/s
sifor 2.32/s
slic 2.46/s
&lt;/c&gt;&lt;/td&gt;&lt;td&gt;&lt;c&gt;
5.014001 c -10
2 ** 8 == 256
Rate mmap
mmap 2056/s
imap 2163/s
simap 2167/s
simap2 2191/s
sfforc 3280/s
fforc 3339/s
sffor 3799/s
ffor 3854/s
sifor 3880/s
ifor 3897/s
smap 4659/s
slic 4748/s


5.014001 c -10
2 ** 16 == 65536
Rate imap
imap 2.07/s
mmap 2.44/s
simap2 2.59/s
simap 2.60/s
sfforc 7.01/s
fforc 7.13/s
sifor 7.58/s
sffor 7.63/s
slic 7.72/s
smap 7.74/s
ffor 7.75/s
ifor 7.81/s


5.014001 c -10
2 ** 18 == 2621440
**too few iter
**too few iter
**too few iter
Rate imap
imap 0.156/s
mmap 0.173/s
simap2 0.177/s
simap 0.177/s
sfforc 1.62/s
fforc 1.63/s
slic 1.67/s
smap 1.67/s
sifor 1.75/s
sffor 1.76/s
ffor 1.77/s
ifor 1.79/s
&lt;/c&gt;&lt;/td&gt;&lt;td&gt;&lt;c&gt;
5.016001 c -10
2 ** 8 == 256
Rate mmap
mmap 2227/s
simap 2282/s
simap2 2283/s
imap 2321/s
sfforc 3331/s
fforc 3382/s
sffor 3484/s
ffor 3575/s
sifor 3772/s
ifor 3831/s
smap 4733/s
slic 4829/s


5.016001 c -10
2 ** 16 == 65536
Rate imap
imap 2.06/s
mmap 2.48/s
simap 2.59/s
simap2 2.65/s
sfforc 6.90/s
smap 6.92/s
slic 7.01/s
sffor 7.07/s
fforc 7.12/s
ffor 7.33/s
sifor 7.43/s
ifor 7.69/s


5.016001 c -10
2 ** 18 == 2621440
**too few iter
**too few iter
**too few iter
Rate imap
imap 0.156/s
mmap 0.176/s
simap2 0.177/s
simap 0.178/s
smap 1.45/s
slic 1.47/s
sfforc 1.60/s
fforc 1.63/s
sffor 1.65/s
ffor 1.68/s
sifor 1.70/s
ifor 1.75/s
&lt;/c&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/spoiler&gt;</field>
<field name="root_node">
1008288</field>
<field name="parent_node">
1008307</field>
<field name="reputation">
1</field>
</data>
</node>
