X-Git-Url: https://git.rrq.au/?a=blobdiff_plain;f=perf_dupdrop.f;h=4575ba1620fe9a6018b683dd301acd2a396f552e;hb=cea392870a443a3d773d18d1627fa94712387cf5;hp=8b0d911c175fcaf28ac29ccd3fc107693c826652;hpb=465979550d58288f6bee28c49064d9c841a6f45f;p=rrq%2Fjonesforth.git diff --git a/perf_dupdrop.f b/perf_dupdrop.f index 8b0d911..4575ba1 100644 --- a/perf_dupdrop.f +++ b/perf_dupdrop.f @@ -1,5 +1,79 @@ ( -*- text -*- FORTH repeated DUP DROP * 1000 using ordinary indirect threaded code and the assembler primitives. - $Id: perf_dupdrop.f,v 1.1 2007-10-10 13:01:05 rich Exp $ ) + $Id: perf_dupdrop.f,v 1.3 2007-10-12 01:46:26 rich Exp $ ) +1024 32 * MORECORE + +( Print the time passed. ) +: PRINT-TIME ( lsb msb lsb msb -- lsb lsb ) + ( The test is very short so likely the MSBs will be the same. This + makes calculating the time easier (because we can only do 32 bit + subtraction). So check MSBs are equal. ) + 2 PICK <> IF + ." MSBs not equal, please repeat the test" CR + ELSE + NIP + SWAP - U. CR + THEN +; + +: 4DROP DROP DROP DROP DROP ; + +: PERFORM-TEST ( xt -- ) + ( Get everything in the cache. ) + DUP EXECUTE 4DROP + DUP EXECUTE 4DROP + DUP EXECUTE 4DROP + DUP EXECUTE 4DROP + DUP EXECUTE 4DROP + DUP EXECUTE 4DROP + 0 0 0 0 PRINT-TIME + ( Run the test 10 times. ) + DUP EXECUTE PRINT-TIME + DUP EXECUTE PRINT-TIME + DUP EXECUTE PRINT-TIME + DUP EXECUTE PRINT-TIME + DUP EXECUTE PRINT-TIME + DUP EXECUTE PRINT-TIME + DUP EXECUTE PRINT-TIME + DUP EXECUTE PRINT-TIME + DUP EXECUTE PRINT-TIME + DUP EXECUTE PRINT-TIME + DROP +; + +( ---------------------------------------------------------------------- ) +( Make a word which builds the repeated DUP DROP sequence. ) +: MAKE-DUPDROP ( n -- ) + BEGIN ?DUP WHILE ' DUP , ' DROP , 1- REPEAT +; + +( Now the actual test routine. ) +: TEST ( -- startlsb startmsb endlsb endmsb ) + RDTSC ( Start time ) + [ 1000 MAKE-DUPDROP ] ( 1000 * DUP DROP ) + RDTSC ( End time ) +; + +: RUN ['] TEST PERFORM-TEST ; +RUN + +( ---------------------------------------------------------------------- ) +( Try the inlined alternative. ) + +( Inline the assembler primitive (cfa) n times. ) +: *(INLINE) ( cfa n -- ) + BEGIN ?DUP WHILE OVER (INLINE) 1- REPEAT DROP +; + +: DUPDROP INLINE DUP INLINE DROP ;CODE + +: TEST + INLINE RDTSC + [ S" DUPDROP" FIND >CFA 1000 *(INLINE) ] + INLINE RDTSC +;CODE + +: RUN ['] TEST PERFORM-TEST ; +RUN