Wrote code to do performance comparisons.
authorrich <rich>
Thu, 11 Oct 2007 07:45:35 +0000 (07:45 +0000)
committerrich <rich>
Thu, 11 Oct 2007 07:45:35 +0000 (07:45 +0000)
Makefile
perf_dupdrop.f

index f5a7494..d47b4d2 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-# $Id: Makefile,v 1.7 2007-10-10 13:01:05 rich Exp $
+# $Id: Makefile,v 1.8 2007-10-11 07:45:35 rich Exp $
 
 SHELL  := /bin/bash
 
@@ -11,7 +11,7 @@ run:
        cat jonesforth.f $(PROG) - | ./jonesforth
 
 clean:
-       rm -f jonesforth *~ core .test_*
+       rm -f jonesforth perf_dupdrop *~ core .test_*
 
 # Tests.
 
@@ -34,8 +34,11 @@ test_%.test: test_%.f jonesforth
 perf_dupdrop: perf_dupdrop.c
        gcc -O3 -Wall -Werror -o $@ $<
 
+run_perf_dupdrop: jonesforth
+       cat <(echo ': TEST-MODE ;') jonesforth.f perf_dupdrop.f | ./jonesforth
+
 .SUFFIXES: .f .test
-.PHONY: test check
+.PHONY: test check run run_perf_dupdrop
 
 remote:
        scp jonesforth.S jonesforth.f rjones@oirase:Desktop/
index 8b0d911..9841538 100644 (file)
@@ -1,5 +1,72 @@
 ( -*- 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.2 2007-10-11 07:45:35 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
+;
+
+: PERFORM-TEST ( xt -- )
+       ( Get everything in the cache. )
+       DUP EXECUTE DUP EXECUTE DUP EXECUTE DUP EXECUTE DUP EXECUTE DUP EXECUTE
+       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