in reply to Fastest way to lookup a point in a set

It's been a while and thought to compare between Perl 5.8.9 - 5.26.0. Also cperl 5.24.2. First, I modified mat_look to safegaurd from auto-vivification. Thanks, roboticus. Results were obtains from a Mac laptop running at 2.6 GHz (i7 Haswell).

sub mat_look { my $cells = shift; for my $p (@points) { exists $cells->{$p->[0]} or die; exists $cells->{$p->[0]}{$p->[1]} or die; } exists $cells->{'notfound'} and die; exists $cells->{'notfound2'} and die; exists $cells->{'notfound3'} and die; }

Results from Perl 5.8.9 - 5.26.0.

timethese 200000, { Big => sub { big_look($big_ref) }, # $cells->{ ($p->[1] << 32) | ($ +p->[0] & 0xFFFFFFFF) } Lan => sub { lan_look($lan_ref) }, # $cells->{ "@$p" } Mat => sub { mat_look($mat_ref) }, # $cells->{ $_->[0] }{ $_->[1] } Pak => sub { pak_look($pak_ref) }, # $cells->{ pack "ii", $p->[0], +$p->[1] } St2 => sub { st2_look($st2_ref) }, # $cells->{ join(':', @$p) } St3 => sub { st3_look($st3_ref) }, # $cells->{ $str } # optimized Str => sub { str_look($str_ref) }, # $cells->{ $p->[0] .':'. $p->[1 +] } };

Notice that stringification "@$p" reaches join(':', @$p) in later releases, 5.22+.

$ /opt/perl-5.8.9/bin/perl test.pl Benchmark: timing 200000 iterations of Big, Lan, Mat, Pak, St2, St3, S +tr... Big: 6 wallclock secs ( 6.05 usr + 0.00 sys = 6.05 CPU) @ 33057.85/s +(n=200000) Lan: 5 wallclock secs ( 4.84 usr + 0.00 sys = 4.84 CPU) @ 41322.31/s +(n=200000) Mat: 7 wallclock secs ( 7.05 usr + 0.00 sys = 7.05 CPU) @ 28368.79/s +(n=200000) Pak: 6 wallclock secs ( 5.67 usr + 0.00 sys = 5.67 CPU) @ 35273.37/s +(n=200000) St2: 5 wallclock secs ( 4.47 usr + 0.00 sys = 4.47 CPU) @ 44742.73/s +(n=200000) St3: 2 wallclock secs ( 2.38 usr + 0.00 sys = 2.38 CPU) @ 84033.61/s +(n=200000) Str: 5 wallclock secs ( 4.90 usr + 0.00 sys = 4.90 CPU) @ 40816.33/s +(n=200000) $ /opt/perl-5.10.1/bin/perl test.pl Benchmark: timing 200000 iterations of Big, Lan, Mat, Pak, St2, St3, S +tr... Big: 6 wallclock secs ( 6.30 usr + 0.00 sys = 6.30 CPU) @ 31746.03/s +(n=200000) Lan: 5 wallclock secs ( 4.83 usr + 0.00 sys = 4.83 CPU) @ 41407.87/s +(n=200000) Mat: 8 wallclock secs ( 7.47 usr + 0.01 sys = 7.48 CPU) @ 26737.97/s +(n=200000) Pak: 6 wallclock secs ( 6.03 usr + 0.00 sys = 6.03 CPU) @ 33167.50/s +(n=200000) St2: 4 wallclock secs ( 4.46 usr + 0.00 sys = 4.46 CPU) @ 44843.05/s +(n=200000) St3: 3 wallclock secs ( 2.46 usr + 0.00 sys = 2.46 CPU) @ 81300.81/s +(n=200000) Str: 5 wallclock secs ( 5.05 usr + 0.00 sys = 5.05 CPU) @ 39603.96/s +(n=200000) $ /opt/perl-5.12.5/bin/perl test.pl Benchmark: timing 200000 iterations of Big, Lan, Mat, Pak, St2, St3, S +tr... Big: 7 wallclock secs ( 6.21 usr + 0.01 sys = 6.22 CPU) @ 32154.34/s +(n=200000) Lan: 4 wallclock secs ( 4.85 usr + 0.00 sys = 4.85 CPU) @ 41237.11/s +(n=200000) Mat: 7 wallclock secs ( 7.36 usr + 0.01 sys = 7.37 CPU) @ 27137.04/s +(n=200000) Pak: 6 wallclock secs ( 5.90 usr + 0.00 sys = 5.90 CPU) @ 33898.31/s +(n=200000) St2: 4 wallclock secs ( 4.47 usr + 0.00 sys = 4.47 CPU) @ 44742.73/s +(n=200000) St3: 3 wallclock secs ( 2.45 usr + 0.00 sys = 2.45 CPU) @ 81632.65/s +(n=200000) Str: 5 wallclock secs ( 5.04 usr + 0.00 sys = 5.04 CPU) @ 39682.54/s +(n=200000) $ /opt/perl-5.14.4/bin/perl test.pl Benchmark: timing 200000 iterations of Big, Lan, Mat, Pak, St2, St3, S +tr... Big: 6 wallclock secs ( 6.16 usr + 0.00 sys = 6.16 CPU) @ 32467.53/s +(n=200000) Lan: 5 wallclock secs ( 4.62 usr + 0.00 sys = 4.62 CPU) @ 43290.04/s +(n=200000) Mat: 7 wallclock secs ( 7.42 usr + 0.00 sys = 7.42 CPU) @ 26954.18/s +(n=200000) Pak: 6 wallclock secs ( 5.87 usr + 0.00 sys = 5.87 CPU) @ 34071.55/s +(n=200000) St2: 4 wallclock secs ( 4.38 usr + 0.00 sys = 4.38 CPU) @ 45662.10/s +(n=200000) St3: 3 wallclock secs ( 2.30 usr + 0.00 sys = 2.30 CPU) @ 86956.52/s +(n=200000) Str: 5 wallclock secs ( 5.04 usr + 0.00 sys = 5.04 CPU) @ 39682.54/s +(n=200000) $ /opt/perl-5.16.3/bin/perl test.pl Benchmark: timing 200000 iterations of Big, Lan, Mat, Pak, St2, St3, S +tr... Big: 7 wallclock secs ( 6.70 usr + 0.01 sys = 6.71 CPU) @ 29806.26/s +(n=200000) Lan: 5 wallclock secs ( 4.84 usr + 0.00 sys = 4.84 CPU) @ 41322.31/s +(n=200000) Mat: 7 wallclock secs ( 7.03 usr + 0.00 sys = 7.03 CPU) @ 28449.50/s +(n=200000) Pak: 6 wallclock secs ( 6.32 usr + 0.00 sys = 6.32 CPU) @ 31645.57/s +(n=200000) St2: 5 wallclock secs ( 4.43 usr + 0.00 sys = 4.43 CPU) @ 45146.73/s +(n=200000) St3: 2 wallclock secs ( 2.40 usr + 0.00 sys = 2.40 CPU) @ 83333.33/s +(n=200000) Str: 6 wallclock secs ( 5.45 usr + 0.01 sys = 5.46 CPU) @ 36630.04/s +(n=200000) $ /opt/perl-5.18.4/bin/perl test.pl Benchmark: timing 200000 iterations of Big, Lan, Mat, Pak, St2, St3, S +tr... Big: 7 wallclock secs ( 6.82 usr + 0.00 sys = 6.82 CPU) @ 29325.51/s +(n=200000) Lan: 5 wallclock secs ( 5.00 usr + 0.00 sys = 5.00 CPU) @ 40000.00/s +(n=200000) Mat: 8 wallclock secs ( 7.64 usr + 0.00 sys = 7.64 CPU) @ 26178.01/s +(n=200000) Pak: 6 wallclock secs ( 6.30 usr + 0.00 sys = 6.30 CPU) @ 31746.03/s +(n=200000) St2: 5 wallclock secs ( 4.88 usr + 0.01 sys = 4.89 CPU) @ 40899.80/s +(n=200000) St3: 3 wallclock secs ( 2.56 usr + 0.00 sys = 2.56 CPU) @ 78125.00/s +(n=200000) Str: 6 wallclock secs ( 5.65 usr + 0.01 sys = 5.66 CPU) @ 35335.69/s +(n=200000) $ /opt/perl-5.20.3/bin/perl test.pl Benchmark: timing 200000 iterations of Big, Lan, Mat, Pak, St2, St3, S +tr... Big: 7 wallclock secs ( 6.50 usr + 0.00 sys = 6.50 CPU) @ 30769.23/s +(n=200000) Lan: 5 wallclock secs ( 5.02 usr + 0.00 sys = 5.02 CPU) @ 39840.64/s +(n=200000) Mat: 7 wallclock secs ( 7.35 usr + 0.00 sys = 7.35 CPU) @ 27210.88/s +(n=200000) Pak: 7 wallclock secs ( 6.25 usr + 0.00 sys = 6.25 CPU) @ 32000.00/s +(n=200000) St2: 4 wallclock secs ( 4.61 usr + 0.00 sys = 4.61 CPU) @ 43383.95/s +(n=200000) St3: 3 wallclock secs ( 2.68 usr + 0.00 sys = 2.68 CPU) @ 74626.87/s +(n=200000) Str: 6 wallclock secs ( 5.63 usr + 0.00 sys = 5.63 CPU) @ 35523.98/s +(n=200000) $ /opt/perl-5.22.4/bin/perl test.pl Benchmark: timing 200000 iterations of Big, Lan, Mat, Pak, St2, St3, S +tr... Big: 6 wallclock secs ( 5.89 usr + 0.00 sys = 5.89 CPU) @ 33955.86/s +(n=200000) Lan: 5 wallclock secs ( 4.68 usr + 0.00 sys = 4.68 CPU) @ 42735.04/s +(n=200000) Mat: 6 wallclock secs ( 6.76 usr + 0.01 sys = 6.77 CPU) @ 29542.10/s +(n=200000) Pak: 6 wallclock secs ( 5.42 usr + 0.00 sys = 5.42 CPU) @ 36900.37/s +(n=200000) St2: 5 wallclock secs ( 4.75 usr + 0.00 sys = 4.75 CPU) @ 42105.26/s +(n=200000) St3: 2 wallclock secs ( 2.42 usr + 0.00 sys = 2.42 CPU) @ 82644.63/s +(n=200000) Str: 5 wallclock secs ( 4.84 usr + 0.00 sys = 4.84 CPU) @ 41322.31/s +(n=200000) $ /opt/perl-5.24.2/bin/perl test.pl Benchmark: timing 200000 iterations of Big, Lan, Mat, Pak, St2, St3, S +tr... Big: 6 wallclock secs ( 6.23 usr + 0.01 sys = 6.24 CPU) @ 32051.28/s +(n=200000) Lan: 5 wallclock secs ( 4.52 usr + 0.00 sys = 4.52 CPU) @ 44247.79/s +(n=200000) Mat: 7 wallclock secs ( 6.92 usr + 0.01 sys = 6.93 CPU) @ 28860.03/s +(n=200000) Pak: 5 wallclock secs ( 5.58 usr + 0.00 sys = 5.58 CPU) @ 35842.29/s +(n=200000) St2: 5 wallclock secs ( 4.53 usr + 0.00 sys = 4.53 CPU) @ 44150.11/s +(n=200000) St3: 2 wallclock secs ( 2.30 usr + 0.00 sys = 2.30 CPU) @ 86956.52/s +(n=200000) Str: 5 wallclock secs ( 4.74 usr + 0.01 sys = 4.75 CPU) @ 42105.26/s +(n=200000) $ /opt/perl-5.26.0/bin/perl test.pl Benchmark: timing 200000 iterations of Big, Lan, Mat, Pak, St2, St3, S +tr... Big: 6 wallclock secs ( 6.04 usr + 0.01 sys = 6.05 CPU) @ 33057.85/s +(n=200000) Lan: 4 wallclock secs ( 4.47 usr + 0.00 sys = 4.47 CPU) @ 44742.73/s +(n=200000) Mat: 7 wallclock secs ( 7.00 usr + 0.01 sys = 7.01 CPU) @ 28530.67/s +(n=200000) Pak: 6 wallclock secs ( 5.56 usr + 0.02 sys = 5.58 CPU) @ 35842.29/s +(n=200000) St2: 5 wallclock secs ( 4.71 usr + 0.02 sys = 4.73 CPU) @ 42283.30/s +(n=200000) St3: 2 wallclock secs ( 2.17 usr + 0.01 sys = 2.18 CPU) @ 91743.12/s +(n=200000) Str: 5 wallclock secs ( 4.78 usr + 0.01 sys = 4.79 CPU) @ 41753.65/s +(n=200000)

Results from cperl-5.24.2c.

$ /opt/cperl-5.24.2c/bin/cperl test.pl Benchmark: timing 200000 iterations of Big, Lan, Mat, Pak, St2, St3, S +tr... Big: 6 wallclock secs ( 5.58 usr + 0.01 sys = 5.59 CPU) @ 35778.18/s +(n=200000) Lan: 4 wallclock secs ( 4.47 usr + 0.00 sys = 4.47 CPU) @ 44742.73/s +(n=200000) Mat: 5 wallclock secs ( 5.98 usr + 0.00 sys = 5.98 CPU) @ 33444.82/s +(n=200000) Pak: 5 wallclock secs ( 5.35 usr + 0.01 sys = 5.36 CPU) @ 37313.43/s +(n=200000) St2: 4 wallclock secs ( 4.46 usr + 0.00 sys = 4.46 CPU) @ 44843.05/s +(n=200000) St3: 3 wallclock secs ( 2.09 usr + 0.00 sys = 2.09 CPU) @ 95693.78/s +(n=200000) Str: 4 wallclock secs ( 4.61 usr + 0.00 sys = 4.61 CPU) @ 43383.95/s +(n=200000)

Regards, Mario

Replies are listed 'Best First'.
Re^2: Fastest way to lookup a point in a set (added test script)
by marioroy (Prior) on Aug 07, 2017 at 01:22 UTC

    Update: Added results from a 4.0 GHz machine running CentOS 7.3.

    The script may be useful in the future for comparing with later versions of Perl.

    timethese 200000, { Big => sub { big_look($big_ref) }, # $cells->{ ($p->[1] << 32) | ($ +p->[0] & 0xFFFFFFFF) } Kgb => sub { kgb_look($kgb_ref) }, # $cells->{ $str } # optimized Lan => sub { lan_look($lan_ref) }, # $cells->{ "@$p" } Mat => sub { mat_look($mat_ref) }, # $cells->{ $_->[0] }{ $_->[1] } Pak => sub { pak_look($pak_ref) }, # $cells->{ pack "ii", $p->[0], +$p->[1] } St2 => sub { st2_look($st2_ref) }, # $cells->{ join(':', @$p) } St3 => sub { st3_look($st3_ref) }, # $cells->{ $str } # optimized Str => sub { str_look($str_ref) }, # $cells->{ $p->[0] .':'. $p->[1 +] } };

    So, here is the test.pl script. Basically, the OP script with extra solutions by various monks in this thread.

    Perhaps, future processors may reach 5 GHz. The following was captured on a CentOS 7.3 machine running at 4.0 GHz. These days, processors are equipped with Turbo Boost allowing up to 4.0 GHz for single task.

    The native Perl on CentOS 7.3 is v5.16.3. I've gone ahead and compiled Perl v5.26.0 for comparison.

    config_args='-Dprefix=/opt/perl-5.26.0 -sder -Dusethreads -Accflags=-m +sse4.2'

    Regards, Mario