File:  [gforth] / gforth / contrib / divspeed.fs
Revision 1.4: download - view: text, annotated - select for diffs
Thu Feb 8 14:07:31 2007 UTC (12 years, 2 months ago) by anton
Branches: MAIN
CVS tags: v0-7-0, HEAD
documentation bug fixes thanks to Sam Falvo and Viktor Pavlu

\ divspeed.fs
\
\ Measure speed of division words in gforth.
\
\ Krishna Myneni, 2006-10-26;
\ Revisions:
\    2006-10-28  change DIVIDEND for 32-bit systems;
\                add tests for */ and M*/  ae, km
(
 In the development version of gforth, code has been added to test for division
 by zero in the division words. We want to measure the performance penalty
 introduced by these tests. Words to be checked are:

   /
   MOD
   /MOD
   */
   */MOD
   FM/MOD
   SM/REM
   UM/MOD
   M*/
)

: ms@ ( -- u | return time in ms)  cputime d+ 1 1000 m*/ d>s ;
: ?allot ( u -- a ) here swap allot ;
: table ( v1 v2 ... vn n <name> -- | create a table of singles ) 
        create dup cells ?allot over 1- cells + swap
        0 ?do dup >r ! r> 1 cells - loop drop ;

1 31 lshift 1- constant  DIVIDEND
DIVIDEND negate s>d 2constant D_DIVIDEND
10000000     constant  N

\ Some helpful macros
variable xt
s" :noname [ xt @ >name name>string ] 2literal type ms@" 2constant s1
    
: get-xt ( "op" -- ) bl word find 0= ABORT" Unknown word!" xt ! ;

: testA ( "op" -- )
    get-xt s1 evaluate
    s" DIVIDEND  N 1 DO dup I" evaluate xt @ compile,
    s" drop LOOP drop ;" evaluate ; immediate

: testB ( "op" -- )
    get-xt s1 evaluate
    s" DIVIDEND  N 1 DO dup I" evaluate xt @ compile,
    s" 2drop LOOP drop ;" evaluate ; immediate
 
: testC ( "op" -- )
    get-xt s1 evaluate
    s" D_DIVIDEND N 1 DO  2dup I" evaluate xt @ compile,
    s" 2drop LOOP 2drop ;" evaluate ; immediate

: testD ( "op" -- )
    get-xt s1 evaluate
    s" DIVIDEND s>d N 1 DO  2dup I" evaluate xt @ compile,
    s" 2drop LOOP 2drop ;" evaluate ; immediate

: testE ( "op" -- )
    get-xt s1 evaluate
    s" D_DIVIDEND N 1 DO  2dup I" evaluate xt @ compile,
    s" drop LOOP 2drop ;" evaluate ; immediate

: testF ( "op" -- )
    get-xt s1 evaluate
    s" D_DIVIDEND N 1 DO  2dup 1 I" evaluate xt @ compile,
    s" 2drop LOOP 2drop ;" evaluate ; immediate

\ The tests return the start time in ms

testA  /
testA  MOD
testB  /MOD
testE  */
testC  */MOD
testC  FM/MOD
testC  SM/REM
testD  UM/MOD   ( testC causes overflow for UM/MOD )
testF  M*/
9 table tests

: .elapsed ( starttime -- ) ms@ 9 emit swap - 4 .r ."  ms" ;

: run-tests
    cr ." Speed Tests:"
    9 0 DO  cr I cells tests + @ execute .elapsed LOOP cr ;


run-tests

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>