Beefy Boxes and Bandwidth Generously Provided by pair Networks
Come for the quick hacks, stay for the epiphanies.
 
PerlMonks  

Re: Fastest way to lookup a point in a set (compares Perl 5.8.9 - 5.26.0)

by marioroy (Prior)
on Aug 06, 2017 at 18:01 UTC ( [id://1196857]=note: print w/replies, xml ) Need Help??


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

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1196857]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others learning in the Monastery: (3)
As of 2024-04-25 02:13 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found