Skip to content

Instantly share code, notes, and snippets.

@MattOates
Last active May 19, 2024 19:41
Show Gist options
  • Save MattOates/c5879a07b1ef2c013097 to your computer and use it in GitHub Desktop.
Save MattOates/c5879a07b1ef2c013097 to your computer and use it in GitHub Desktop.
Combined primes benchmark with a parallel implementation that does well to keep up despite doing a lot more calculations!
#!/usr/bin/env perl6
use v6;
use Stats;
sub bench(Str $name, Int $upto, &code) {
my ($start,$end);
my @times;
for 1..20 {
$start = now;
code($upto);
$end = now;
@times.push($end-$start);
}
my $sd = sd @times;
my $mu = mean @times;
say "$name: ran in $mu seconds (σ = $sd seconds)";
}
sub MAIN(Int :$upto) {
bench 'primes-inline-loop', $upto, {
my Int @primes;
TOCHECK: loop (my $n = 2; $n <= $^max; $n++) {
for @primes -> Int $prime {
next TOCHECK if $n %% $prime;
}
@primes.push($n);
}
}
bench 'primes-inline-loop-upto-sqrt', $upto, {
my Int @primes;
TOCHECK: loop (my $n = 2; $n <= $^max; $n++) {
my Num $sqrt-n = sqrt $n;
for @primes -> Int $prime {
next TOCHECK if $n %% $prime;
last if $prime >= $sqrt-n; # OK to bail if ==; we checked %% above
}
@primes.push($n);
}
}
bench 'primes-inline-loop-upto-int-sqrt', $upto, {
my int @primes;
TOCHECK: loop (my int $n = 2; $n <= $^max; $n++) {
my int $sqrt-n = truncate sqrt $n;
for @primes -> int $prime {
next TOCHECK if $n %% $prime;
last if $prime >= $sqrt-n; # OK to bail if ==; we checked %% above
}
@primes.push($n);
}
}
bench 'primes-builtin-grep', $upto, {
my @primes = (2..$^max).grep: *.is-prime;
}
bench 'primes-builtin-parallel-grep', $upto, {
my @primes = (2..$^max).race(batch => $^max / 4, degree => 4).grep: *.is-prime;
}
bench 'primes-naive-grep', $upto, {
my @primes = (2 .. $^max).grep({
(2 .. truncate sqrt $^n).grep($^n %% *).elems == 0;
});
}
bench 'primes-naive-parallel-grep', $upto, {
my @primes = (2 .. $^max).race(batch => $^max / 4, degree => 4).grep({
(2 .. truncate sqrt $^n).grep($^n %% *).elems == 0;
});
}
}
@MattOates
Copy link
Author

Running with Rakudo v2021.12 on MacBook Pro with M1 Pro 10 core

raku find-primes.raku --upto=1000
primes-inline-loop: ran in 0.01004322775 seconds (σ = 0.015566435698432525 seconds)
primes-inline-loop-upto-sqrt: ran in 0.0021444244 seconds (σ = 0.0006014301541457775 seconds)
primes-inline-loop-upto-int-sqrt: ran in 0.0017250761 seconds (σ = 0.0005452344272131783 seconds)
primes-builtin-grep: ran in 0.0006137899 seconds (σ = 0.0005555497241630495 seconds)
primes-builtin-parallel-grep: ran in 0.0015878532 seconds (σ = 0.001983326629655843 seconds)
primes-naive-grep: ran in 0.022108198449999998 seconds (σ = 0.0009993921414470288 seconds)
primes-naive-parallel-grep: ran in 0.01397306805 seconds (σ = 0.0008803797823021999 seconds)

raku find-primes.raku --upto=4000
primes-inline-loop: ran in 0.044283732799999996 seconds (σ = 0.011909012650670021 seconds)
primes-inline-loop-upto-sqrt: ran in 0.0091936939 seconds (σ = 0.0005906285005060453 seconds)
primes-inline-loop-upto-int-sqrt: ran in 0.0072716675 seconds (σ = 0.0005839996615820925 seconds)
primes-builtin-grep: ran in 0.0018863263500000001 seconds (σ = 0.0007506107664876773 seconds)
primes-builtin-parallel-grep: ran in 0.00185553465 seconds (σ = 0.0020809822610920736 seconds)
primes-naive-grep: ran in 0.14554954675 seconds (σ = 0.0019736673265611866 seconds)
primes-naive-parallel-grep: ran in 0.07221033545 seconds (σ = 0.006950228909433103 seconds)

raku find-primes.raku --upto=10000
primes-inline-loop: ran in 0.2011304914 seconds (σ = 0.013926456832506444 seconds)
primes-inline-loop-upto-sqrt: ran in 0.02549488425 seconds (σ = 0.0005571448593402978 seconds)
primes-inline-loop-upto-int-sqrt: ran in 0.01931281135 seconds (σ = 0.0006822094200030417 seconds)
primes-builtin-grep: ran in 0.00436385715 seconds (σ = 0.0005480360717324083 seconds)
primes-builtin-parallel-grep: ran in 0.0023704015500000002 seconds (σ = 0.0023306963335366837 seconds)
primes-naive-grep: ran in 0.5454789365 seconds (σ = 0.0024097584454185364 seconds)
primes-naive-parallel-grep: ran in 0.2864098717 seconds (σ = 0.03974775012003365 seconds)

@MattOates
Copy link
Author

Running with Rakudo v2023.02 and MoarVM version 2023.02 on a Windows 11 PC using an AMD Ryzen 5 5600X MPK Prism and 2x16GB CorVenLPX DDR4 3600C 18 of memory.

PS C:\Users\matto> raku find-primes.raku --upto=1000
primes-inline-loop: ran in 0.0050568950000000005 seconds (σ = 0.0019135264524948324 seconds)
primes-inline-loop-upto-sqrt: ran in 0.0023065 seconds (σ = 0.0012005748645939171 seconds)
primes-inline-loop-upto-int-sqrt: ran in 0.001802615 seconds (σ = 0.001146828056373326 seconds)
primes-builtin-grep: ran in 0.0005507299999999999 seconds (σ = 0.000850845533912743 seconds)
primes-builtin-parallel-grep: ran in 0.0019552099999999998 seconds (σ = 0.0029532143600834223 seconds)
primes-naive-grep: ran in 0.023995045 seconds (σ = 0.003148231928632888 seconds)
primes-naive-parallel-grep: ran in 0.013312584999999998 seconds (σ = 0.0019379224621425633 seconds)

PS C:\Users\matto> raku find-primes.raku --upto=4000
primes-inline-loop: ran in 0.043977050000000004 seconds (σ = 0.0038821551485842074 seconds)
primes-inline-loop-upto-sqrt: ran in 0.009914275 seconds (σ = 0.0012950653723423746 seconds)
primes-inline-loop-upto-int-sqrt: ran in 0.007219765 seconds (σ = 0.0013275851371994162 seconds)
primes-builtin-grep: ran in 0.0016525700000000001 seconds (σ = 0.0010420731572608353 seconds)
primes-builtin-parallel-grep: ran in 0.00252828 seconds (σ = 0.003520011884978961 seconds)
primes-naive-grep: ran in 0.16787363 seconds (σ = 0.007972814090928723 seconds)
primes-naive-parallel-grep: ran in 0.078848115 seconds (σ = 0.007144407603725878 seconds)

PS C:\Users\matto> raku find-primes.raku --upto=10000
primes-inline-loop: ran in 0.196803405 seconds (σ = 0.007683908761939135 seconds)
primes-inline-loop-upto-sqrt: ran in 0.024585614999999998 seconds (σ = 0.0028958402375199974 seconds)
primes-inline-loop-upto-int-sqrt: ran in 0.019132635000000002 seconds (σ = 0.0025026631529515508 seconds)
primes-builtin-grep: ran in 0.00370609 seconds (σ = 0.0011789071852645319 seconds)
primes-builtin-parallel-grep: ran in 0.0034111500000000004 seconds (σ = 0.0037983079611655394 seconds)
primes-naive-grep: ran in 0.634306935 seconds (σ = 0.04044783802771811 seconds)
primes-naive-parallel-grep: ran in 0.27289585 seconds (σ = 0.013028538827568555 seconds)

@MattOates
Copy link
Author

First run on an M1 Pro Macbook Pro

➜ zef git:(main) raku ~/bin/find-primes.raku --upto=1000
primes-inline-loop: ran in 0.0072473708 seconds (σ = 0.006680025362886249 seconds)
primes-inline-loop-upto-sqrt: ran in 0.002169841 seconds (σ = 0.0005846115771510021 seconds)
primes-inline-loop-upto-int-sqrt: ran in 0.001736742 seconds (σ = 0.0006214027234185742 seconds)
primes-builtin-grep: ran in 0.000584616 seconds (σ = 0.0005148058293779747 seconds)
primes-builtin-parallel-grep: ran in 0.00153531225 seconds (σ = 0.0019351125540771849 seconds)
primes-naive-grep: ran in 0.0210788355 seconds (σ = 0.0013931801572090125 seconds)
primes-naive-parallel-grep: ran in 0.01147687535 seconds (σ = 0.001198478877677276 seconds)

➜ zef git:(main) raku ~/bin/find-primes.raku --upto=4000
primes-inline-loop: ran in 0.0468484226 seconds (σ = 0.019635280771149354 seconds)
primes-inline-loop-upto-sqrt: ran in 0.010372989150000001 seconds (σ = 0.0005093287011327316 seconds)
primes-inline-loop-upto-int-sqrt: ran in 0.007157870500000001 seconds (σ = 0.0005815257291472761 seconds)
primes-builtin-grep: ran in 0.0018524338500000002 seconds (σ = 0.0004970552946949883 seconds)
primes-builtin-parallel-grep: ran in 0.0019807862999999997 seconds (σ = 0.0022700226223986925 seconds)
primes-naive-grep: ran in 0.13691626065 seconds (σ = 0.0015472421177950425 seconds)
primes-naive-parallel-grep: ran in 0.05019228535 seconds (σ = 0.003706547497701837 seconds)

➜ zef git:(main) raku ~/bin/find-primes.raku --upto=10000
primes-inline-loop: ran in 0.19926601495000001 seconds (σ = 0.011636135647852488 seconds)
primes-inline-loop-upto-sqrt: ran in 0.0290350873 seconds (σ = 0.0005717311702342393 seconds)
primes-inline-loop-upto-int-sqrt: ran in 0.01949524185 seconds (σ = 0.0007170818191406237 seconds)
primes-builtin-grep: ran in 0.0044379843 seconds (σ = 0.00045680951848042816 seconds)
primes-builtin-parallel-grep: ran in 0.00279419885 seconds (σ = 0.002497165698350676 seconds)
primes-naive-grep: ran in 0.5074069433 seconds (σ = 0.0039019076032818212 seconds)
primes-naive-parallel-grep: ran in 0.1813150039 seconds (σ = 0.0035306037434770176 seconds)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment