( * * LANGUAGE : ANS Forth * PROJECT : Forth Environments * DESCRIPTION : experiments on iForth run time costs * CATEGORY : Example * AUTHOR : Marcel Hendrix * LAST CHANGE : June 15, 2002, Marcel Hendrix * ) \ REVISION -timemod "ÄÄÄ Runtime costs Version 0.01 ÄÄÄ" CREATE tmp2 256 CHARS ALLOT : +PLACE ($+) ; : []CELL S" SWAP CELLS + " EVALUATE ; IMMEDIATE : CELL[] S" CELLS + " EVALUATE ; IMMEDIATE : S~ 0 tmp2 C! [char] ~ WORD COUNT tmp2 +PLACE tmp2 COUNT POSTPONE SLITERAL ; IMMEDIATE : DEC. BASE @ >R DECIMAL . R> BASE ! ; true constant ndp? \ -- flag ; true if NDP stack version S" ../../lib/ndp387.fth" INCLUDED char . dp-char ! \ select ANS number conversion char . fp-char ! S" VfxUtil" INCLUDED \ FSL harness for ProForth VFX 3.0 : FNIP FSWAP FDROP ; 0 VALUE _timer_ extern: DWORD PASCAL GetTickCount( void ) : TIMER-RESET GetTickCount TO _timer_ ; : MS? GetTickCount _timer_ - ; : n.ELAPSED U. ." ms elapsed." ; : .ELAPSED MS? n.ELAPSED ; #166 VALUE PROCESSOR-CLOCK 2VARIABLE _ticks_ ( counts clock ticks ) \ how I hate this fancy gotcha shit... \ Lines 1 and 2 are placed in reverse from them being assembled! CODE TICKS-GET ( -- d ) SUB EBP, 8 MOV 4 [EBP], EBX ( 1 ) MOV 0 [EBP], EAX ( 2 ) $0F C, $31 C, \ RDTSC MOV EBX, EDX RET END-CODE : TICKS-RESET ( -- ) TICKS-GET _ticks_ 2! ; TICKS-RESET : TICKS>US ( d -- u ) PROCESSOR-CLOCK UM/MOD NIP ; : TICKS? ( -- u ) TICKS-GET _ticks_ 2@ D- ; 9 CONSTANT TAB 0 [IF] DOC (* Copyright (C) 1999 Lucent Technologies From 'Programming Pearls' by Jon Bentley timemod.c -- Produce table of iForth run time costs C Time Cost Model, n=5000 Integer Arithmetic (n=5000) {} 1263 1313 1263 1263 1263 5 k++ 2011 2011 2010 2011 2011 8 k = i + j 2260 2260 2260 2260 2260 9 k = i - j 2244 2260 2259 2260 2260 9 k = i * j 4023 4005 4023 4022 4023 16 k = i / j 13814 13814 13980 13914 14163 56 k = i % j 13814 13814 13814 13797 13797 55 k = i & j 2260 2277 2260 2260 2260 9 k = i | j 2260 2260 2260 2260 2260 9 Floating Point Arithmetic (n=5000) fj=j; 5019 5003 5021 4970 5036 20 fj=j; fk = fi + fj; 5021 5019 5019 5021 5019 20 fj=j; fk = fi - fj; 5019 5021 5036 5019 5021 20 fj=j; fk = fi * fj; 5036 5021 5019 5019 5038 20 fj=j; fk = fi / fj; 12549 12551 12551 12551 12567 50 Array Operations (n=5000) k = i + j 2260 2260 2260 2260 2260 9 k = x[i] + j 2808 2810 2775 2808 2810 11 k = i + x[j] 2908 3341 2893 2875 2860 12 k = x[i] + x[j] 3490 3507 3490 3490 3490 14 Comparisons (n=5000) if (i < j) k++ 2393 2393 2377 2393 2393 10 if (x[i] < x[j]) k++ 2926 2924 2926 2908 2926 12 Array Comparisons and Swaps (n=5000) k = (x[i] j) ? i : j 2509 2509 2509 2526 2511 10 k = maxmac(i, j) 2509 2509 2526 2509 2509 10 k = maxfunc(i, j) 5536 5519 5536 5519 5534 22 Math Functions (n=1000) fk = j+fi; 151 149 166 166 149 16 k = rand(); 715 680 698 682 697 69 fk = sqrt(j+fi) 2360 2343 2360 2343 2343 235 fk = sin(j+fi) 2743 2742 2742 2743 2758 275 fk = sinh(j+fi) 9209 9226 9226 9242 9226 923 fk = asin(j+fi) 7747 7730 7728 7714 7714 773 fk = cos(j+fi) 2758 2758 2760 2758 2760 276 fk = tan(j+fi) 3256 3258 3258 3258 3258 326 Memory Allocation (n=500) free(malloc(16)); 1113 1113 1113 1113 1097 444 free(malloc(100)); 1296 1296 1296 1296 1296 519 free(malloc(2000)); 1296 1279 1298 1279 1296 516 Secs: 513.37 iForth Time Cost Model, n=100 Integer Arithmetic (n=100) ( ) 63 63 63 63 63 6 1 +TO kk 93 93 93 93 93 9 i j + TO kk 113 113 113 113 113 11 i j - TO kk 93 93 93 93 95 9 i j * TO kk 174 174 174 174 174 17 i j / TO kk 615 613 666 679 679 65 i j MOD TO kk 679 682 679 679 690 68 i j AND TO kk 154 154 154 154 156 15 i j OR TO kk 154 154 154 154 154 15 Floating Point Arithmetic (n=100) j S>F TO fj 207 204 204 204 204 20 j S>F TO fj fi fj F+ TO fk 215 213 213 213 213 21 j S>F TO fj fi fj F- TO fk 213 220 213 213 213 21 j S>F TO fj fi fj F* TO fk 213 213 216 213 213 21 j S>F TO fj fi fj F/ TO fk 573 575 573 575 573 57 Array Operations (n=100) i j + TO kk 113 113 113 115 113 11 i x []CELL @ j + TO kk 114 113 113 113 113 11 i j x []CELL @ + TO kk 114 115 114 114 114 11 i x []CELL @ j x []CELL @ + TO kk 124 124 124 124 124 12 Comparisons (n=100) I J < IF 1 +TO kk ENDIF 99 102 99 99 99 10 x I CELL[] @ x J CELL[] @ < IF 1 +TO kk ENDIF 142 142 142 142 142 14 Array Comparisons and Swaps (n=100) x I CELL[] @ x kk CELL[] @ < IF -1 ELSE 1 ENDIF TO kk 185 184 184 184 184 18 x I CELL[] x J CELL[] intcmp TO kk 126 124 124 124 124 12 I J swapmac 217 217 217 217 217 21 I J swapfunc 306 306 307 306 306 30 Max Function, Macro and Inline (n=100) I J MAX TO kk 180 182 180 180 180 18 I J maxmac TO kk 180 190 180 180 180 18 I J maxfunc TO kk 311 307 307 307 307 30 Math Functions (n=50) j S>F fi F+ TO fk 44 44 44 44 44 17 RANDOM S>F TO fk 478 477 477 477 486 191 j S>F fi F+ FSQRT TO fk 219 224 219 219 219 88 j S>F fi F+ FSIN TO fk 268 268 268 268 268 107 j S>F fi F+ FSINH TO fk 829 827 829 828 832 331 j S>F fi F+ FASIN TO fk 671 669 669 672 669 268 j S>F fi F+ FCOS TO fk 268 268 268 269 268 107 j S>F fi F+ FTAN TO fk 392 394 392 392 392 157 Memory Allocation (n=10) #16 ALLOCATE DROP FREE DROP 106 102 103 103 103 1038 #100 ALLOCATE DROP FREE DROP 117 115 115 115 116 1159 #2000 ALLOCATE DROP FREE DROP 488 486 496 487 486 4889 1.083 seconds elapsed. ok *) ENDDOC [THEN] CREATE idiot$ 0 C, #255 ALLOT S" Tcl is an interpreter for a tool command language. It consists of a library " idiot$ +PLACE S" package that is embedded in tools (such as editors, debuggers, etc.) as the " idiot$ +PLACE S" basic command interpreter." idiot$ +PLACE #100000 CONSTANT MAXN CREATE x MAXN CELLS ALLOT #100 VALUE startn \ FUNCTIONS TO BE TIMED : intcmp ( 'i 'j -- u ) >R @ R> @ - ; : swapmac ( i j -- ) x []CELL >R x []CELL DUP @ R@ @ ROT ! R> ! ; : swapfunc ( i j -- ) x []CELL >R x []CELL DUP @ R@ @ ROT ! R> ! ; : maxmac ( a b -- u ) MAX ; : maxfunc ( a b -- u ) 2DUP > IF NIP ELSE DROP ENDIF ; \ WORKHORSE CREATE temp #256 CHARS ALLOT : T" 0 temp C! S~ CR CR ." ~ temp +PLACE [char] " WORD COUNT temp +PLACE S~ (n=" n 0 .R [char] ) EMIT~ temp +PLACE temp COUNT EVALUATE ; IMMEDIATE 15 CONSTANT STRIALS 20 CONSTANT TRIALS : M" ( -- ) 0 tmp2 C! [char] " WORD COUNT tmp2 +PLACE tmp2 COUNT POSTPONE SLITERAL S" CR 55 OVER - >R TYPE R> SPACES " EVALUATE S" 0 TO kk 0 TO tsum " EVALUATE S" TRIALS 0 DO " EVALUATE S" TICKS-RESET" EVALUATE S" n 1+ 1 DO I S>F TO fi " EVALUATE S" n 1+ 1 DO" EVALUATE tmp2 COUNT EVALUATE S" LOOP " EVALUATE S" LOOP " EVALUATE S" TICKS? DROP DUP " EVALUATE S" I STRIALS >= IF #1000 / 6 .R " EVALUATE S" ELSE 2DROP 0 " EVALUATE S" ENDIF " EVALUATE S" tsum + TO tsum " EVALUATE S" LOOP " EVALUATE S" tsum n n * TRIALS STRIALS - * / 8 .R " EVALUATE ; IMMEDIATE 0e FVALUE fi 0e FVALUE fj 0e FVALUE fk : TIMES ( -- ) 0 0 0 0 LOCALS| kk tsum n file | MAXN 0 DO RANDOM x I CELL[] ! LOOP startn TO n 0 TO kk CR ." iForth Time Cost Model, n=" n DEC. TIMER-RESET T" Integer Arithmetic" M" ( )" M" kk 1+ TO kk" M" I J + TO kk" M" i j - TO kk" M" i j * TO kk" M" i j / TO kk" M" i j MOD TO kk" M" i j AND TO kk" M" i j OR TO kk" T" Floating Point Arithmetic" M" j S>F TO fj" M" j S>F TO fj fi fj F+ TO fk" M" j S>F TO fj fi fj F- TO fk" M" j S>F TO fj fi fj F* TO fk" M" j S>F TO fj fi fj F/ TO fk" T" Array Operations" M" i j + TO kk" M" i x []CELL @ j + TO kk" M" i j x []CELL @ + TO kk" M" i x []CELL @ j x []CELL @ + TO kk" T" Comparisons" M" I J < IF kk 1+ TO kk ENDIF" M" x I CELL[] @ x J CELL[] @ < IF kk 1+ TO kk ENDIF" T" Array Comparisons and Swaps" M" x I CELL[] @ x kk CELL[] @ < IF -1 ELSE 1 ENDIF TO kk" M" x I CELL[] x J CELL[] intcmp TO kk" M" I J swapmac" M" I J swapfunc" T" Max Function, Macro and Inline" M" I J MAX TO kk" M" I J maxmac TO kk" M" I J maxfunc TO kk" startn 2/ TO n T" Math Functions" M" j S>F fi F+ TO fk" M" RANDOM S>F TO fk" M" j S>F fi F+ FSQRT TO fk" M" j S>F fi F+ FSIN TO fk" M" j S>F fi F+ FSINH TO fk" M" j S>F fi F+ FASIN TO fk" M" j S>F fi F+ FCOS TO fk" M" j S>F fi F+ FTAN TO fk" startn #10 / TO n T" Memory Allocation" M" #16 ALLOCATE DROP FREE DROP" M" #100 ALLOCATE DROP FREE DROP" M" #2000 ALLOCATE DROP FREE DROP" T" Input and Output" S" c:\tm.dat" R/W BIN CREATE-FILE THROW TO file M" idiot$ COUNT file WRITE-LINE THROW" file CLOSE-FILE THROW S" c:\tm.dat" R/O BIN OPEN-FILE THROW TO file M" PAD 256 file READ-LINE THROW 2DROP" file CLOSE-FILE THROW CR .ELAPSED ; : .ABOUT CR ." Try: TIMES" ; .ABOUT CR ( * End of Source * )