BTW: The Go programming language which has direct
style runs the primes example in 0.6 seconds.
The primes example is here:
The Go Playground
https://go.dev/play/
Just choose the Concurrent Prime Sieve example.
Twice as slow as the 0.3 seconds of Haskell but
nevertheless faster than Prolog.
For those interested was comparing to:
Prolog Hand Rolled Lazy Lists via call/n:
=============================================
iter(F,A,A,iter(F,B)) :- call(F,A,B).
take(0, _, []) :- !.
take(N, C, [X|L]) :- M is N-1, call(C, X, D), take(M, D, L).
modfilt(C, M, X, E) :- call(C, Y, D), modfilt2(D, M, Y, X, E).
modfilt2(D, M, Y, X, E) :- Y mod M =:= 0, !, modfilt(D, M, X, E).
modfilt2(D, M, X, X, modfilt(D,M)).
primes(C, X, primes(modfilt(D,X))) :- call(C, X, D).
/* on @emiruz machine */
?- time(take(5000,primes(iter(succ,2)),_)).
% 38,009,267 inferences, 2.005 CPU in 2.005
seconds (100% CPU, 18954407 Lips)
true.
Haskell David Turner's sieve (SASL Language Manual, 1983)
=============================================
sieve :: [Integer] -> [Integer]
sieve [] = []
sieve (p:xs) = p : sieve [x | x <- xs, rem x p > 0]
/* on @emiruz machine */
time ./primes
% real 0m0.312s
% user 0m0.294s
% sys 0m0.005s
https://wiki.haskell.org/Prime_numbers#Turner.27s_sieve_-_Trial_division
Disclaimer: Didn't run the Go version by myself
yet. Have first to install Go etc.. Somebody
else run it and reported 0.6 seconds.
Mild Shock schrieb: