About 3% faster, 41,662 CPU cycles for a single iteration.
-- Ideas: M. Anton Ertl
http://www.complang.tuwien.ac.at/anton/home.html
ANEW -sieves
#100000 =: #times
#8190 =: size
CREATE FLAGS size 10 * ALLOT
variable eflag
flags size + eflag !
-- iForth
: DO-PRIME 0 LOCAL cnt
flags size 1 FILL
flags
size 0 DO
C@+ IF
I 2* 3 +
DUP I + SWAP >R
BEGIN DUP size
U< WHILE DUP flags + C0!
R@ +
REPEAT DROP
-R 1 +TO cnt
ENDIF
LOOP
DROP cnt ;
: PRIMES-as4 ( -- n )
FLAGS 8190 1 FILL
0 3 EFLAG @ FLAGS DO ( u1 prime-candidate )
I C@ IF ( u1 prime )
DUP I + DUP EFLAG @ < IF ( u1 prime addr )
EFLAG @ SWAP begin ( prime limit index )
0 over c! 2 pick +
0 over c! 2 pick +
0 over c! 2 pick +
0 over c! 2 pick + 2dup u<= until
2drop
ELSE
DROP
THEN
SWAP 1+ SWAP
THEN
2 +
LOOP
DROP ;
: PRIMES-et3 ( -- n )
FLAGS 8190 1 FILL
0 3 EFLAG @ FLAGS DO ( counter prime-candidate )
I C@ IF ( counter prime )
DUP I + DUP 2 pick 2* + EFLAG @ u< IF ( counter prime addr )
EFLAG @ SWAP begin ( counter prime limit index )
\ 0 over c! 2 pick +
0 over c! 2 pick +
0 over c! 2 pick +
0 over c! 2 pick +
over 3 pick 2* 2 pick + u<= until ( counter prime limit
index )
begin
2dup u> while
0 over c! 2 pick +
repeat
2drop
ELSE
DROP
THEN
SWAP 1+ SWAP
THEN
2 +
LOOP
DROP ;
: .DIFF ( d -- ) TICKS-GET 2SWAP D- (n,3) ." clock ticks." ;
: PRIMES
CR #times DEC. ." iterations."
CR ." \ do-prime : " TICKS-GET #times 0 DO DO-PRIME DROP LOOP DIFF
CR ." \ primes-as4 : " TICKS-GET #times 0 DO PRIMES-as4 DROP LOOP DIFF
CR ." \ primes-et3 : " TICKS-GET #times 0 DO PRIMES-et3 DROP LOOP DIFF ;
FORTH> PRIMES
100000 iterations.
\ do-prime : 4,312,568,627 ticks.
\ primes-as4 : 4,167,558,125 ticks.
\ primes-et3 : 4,540,875,427 ticks. ok
FORTH> see primes-as4
Flags: ANSI
$01356200 : PRIMES-as4
$0135620A push $01341CC0 d#
$0135620F push $00001FFE d#
$01356214 push 1 b#
$01356216 lea rbp, [rbp -8 +] qword
$0135621A mov [rbp 0 +] qword, $01356227 d#
$01356222 jmp FILL+10 ( $0124179A ) offset NEAR
$01356227 push 0 b#
$01356229 push 3 b#
$0135622B push $01355CC0 qword-offset
$01356231 mov rbx, $01341CC0 d#
$01356238 pop rcx
$01356239 call (DO) offset NEAR
$01356243 lea rax, [rax 0 +] qword
$01356248 mov rdi, [rbp 0 +] qword
$0135624C cmp [rdi] byte, 0 b#
$0135624F je $013562DC offset NEAR
$01356255 mov rdi, [rbp 0 +] qword
$01356259 lea rax, [rbx rdi*1] qword
$0135625D mov rcx, $01355CC0 qword-offset
$01356264 cmp rcx, rax
$01356267 push rbx
$01356268 mov rbx, rcx
$0135626B mov rcx, rax
$0135626E mov rbx, rcx
$01356271 jle $013562D5 offset NEAR
$01356277 push $01355CC0 qword-offset
$0135627D mov rax, rax
$01356280 mov [rbx] byte, 0 b#
$01356283 mov rcx, rbx
$01356286 mov rbx, [rsp 8 +] qword
$0135628B mov [rcx rbx*1] byte, 0 b#
$0135628F lea rbx, [rcx rbx*1] qword
$01356293 mov rcx, rbx
$01356296 mov rbx, [rsp 8 +] qword
$0135629B mov [rcx rbx*1] byte, 0 b#
$0135629F lea rbx, [rcx rbx*1] qword
$013562A3 mov rcx, rbx
$013562A6 mov rbx, [rsp 8 +] qword
$013562AB mov [rcx rbx*1] byte, 0 b#
$013562AF lea rbx, [rcx rbx*1] qword
$013562B3 mov rcx, rbx
$013562B6 mov rbx, [rsp 8 +] qword
$013562BB pop rdi
$013562BC lea rax, [rcx rbx*1] qword
$013562C0 cmp rax, rdi
$013562C3 push rdi
$013562C4 mov rcx, rax
$013562C7 push rcx
$013562C8 pop rbx
$013562C9 jb $01356280 offset NEAR
$013562CF pop rdi
$013562D0 jmp $013562D5 offset NEAR
$013562D5 pop rbx
$013562D6 pop rdi
$013562D7 lea rdi, [rdi 1 +] qword
$013562DB push rdi
$013562DC lea rbx, [rbx 2 +] qword
$013562E0 add [rbp 0 +] qword, 1 b#
$013562E5 add [rbp 8 +] qword, 1 b#
$013562EA jno $01356248 offset NEAR
$013562F0 add rbp, #24 b#
$013562F4 ;
-marcel
--- SoupGate-Win32 v1.05
* Origin: fsxNet Usenet Gateway (21:1/5)