(* * 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 *) NEEDS -miscutil REVISION -timemod "ÄÄÄ Runtime costs Version 0.01 ÄÄÄ" DOC (* On Intel P54c 166 MHz Copyright (C) 1999 Lucent Technologies From 'Programming Pearls' by Jon Bentley timemod.c -- Produce table of iForth run time costs ( lcc ) 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 2.0 ) iForth Time Cost Model, n=100 Integer Arithmetic (n=100) ( ) 64 64 64 64 64 6 1 +TO kk 94 94 94 94 94 9 i j + TO kk 104 104 104 104 104 10 i j - TO kk 84 86 84 84 84 8 i j * TO kk 164 164 164 164 176 16 i j / TO kk 604 604 643 604 606 61 i j MOD TO kk 604 605 604 604 605 60 i j AND TO kk 84 84 84 84 84 8 i j OR TO kk 84 86 84 84 84 8 Floating Point Arithmetic (n=100) j S>F TO fj 204 204 204 204 204 20 j S>F TO fj fi fj F+ TO fk 278 278 278 278 278 27 j S>F TO fj fi fj F- TO fk 278 278 280 278 278 27 j S>F TO fj fi fj F* TO fk 278 278 278 278 278 27 j S>F TO fj fi fj F/ TO fk 586 578 578 580 578 58 Array Operations (n=100) i j + TO kk 104 106 104 104 104 10 i x []CELL @ j + TO kk 105 104 104 104 104 10 i j x []CELL @ + TO kk 104 104 104 104 104 10 i x []CELL @ j x []CELL @ + TO kk 115 114 114 114 114 11 Comparisons (n=100) I J < IF 1 +TO kk ENDIF 100 100 100 100 100 10 x I CELL[] @ x J CELL[] @ < IF 1 +TO kk ENDIF 144 142 142 142 142 14 Array Comparisons and Swaps (n=100) x I CELL[] @ x kk CELL[] @ < IF -1 ELSE 1 ENDIF TO kk 154 155 154 154 154 15 x I CELL[] x J CELL[] intcmp TO kk 114 114 114 114 116 11 I J swapmac 227 227 227 227 227 22 I J swapfunc 306 306 306 306 308 30 Max Function, Macro and Inline (n=100) I J MAX TO kk 110 110 110 110 110 11 I J maxmac TO kk 110 110 110 110 110 11 I J maxfunc TO kk 248 246 246 246 246 24 Math Functions (n=50) j S>F fi F+ TO fk 64 77 64 64 64 26 RANDOM S>F TO fk 115 114 114 114 114 45 j S>F fi F+ FSQRT TO fk 239 239 239 240 239 95 j S>F fi F+ FSIN TO fk 285 285 284 286 284 114 j S>F fi F+ FSINH TO fk 842 843 842 867 843 339 j S>F fi F+ FASIN TO fk 670 671 669 671 669 268 j S>F fi F+ FCOS TO fk 285 286 285 285 285 114 j S>F fi F+ FTAN TO fk 412 411 411 411 413 164 Memory Allocation (n=10) #16 ALLOCATE DROP FREE DROP 90 93 93 93 94 930 #100 ALLOCATE DROP FREE DROP 103 105 105 105 107 1058 #2000 ALLOCATE DROP FREE DROP 482 484 484 486 484 4842 Input and Output (n=10) idiot$ COUNT file WRITE-LINE THROW 661 671 669 665 683 6701 PAD 256 file READ-LINE THROW 2DROP 772 774 750 752 772 7645 1.895 seconds elapsed. ( VFX hardware and software stack both give "potential exception" ) include timemod Including timemod.fth Including ../../lib/ndp387.fth (FLITERAL) is redefined Including VfxUtil.fth VFXUTIL.FTH v1.00 6 October 1999 Try: TIMES ok times iForth Time Cost Model, n=100 Integer Arithmetic (n=100) ( ) 74 74 74 74 74 7 kk 1+ TO kk 65 64 64 64 64 6 I J + TO kk 105 105 105 105 105 10 i j - TO kk 105 105 105 105 105 10 i j * TO kk 185 185 185 185 185 18 i j / TO kk 585 586 585 585 591 58 i j MOD TO kk 667 665 665 665 665 66 i j AND TO kk 105 105 105 105 105 10 i j OR TO kk 105 105 115 105 105 10 Floating Point Arithmetic (n=100) j S>F TO fj 356 356 356 356 358 35 j S>F TO fj fi fj F+ TO fk 643 629 630 629 629 63 j S>F TO fj fi fj F- TO fk 632 629 629 630 629 63 j S>F TO fj fi fj F* TO fk 630 631 629 629 630 63 j S>F TO fj fi fj F/ TO fk 988 980 979 980 979 98 Array Operations (n=100) i j + TO kk 105 105 105 105 105 10 i x []CELL @ j + TO kk 137 136 136 136 136 13 i j x []CELL @ + TO kk 135 135 135 135 135 13 i x []CELL @ j x []CELL @ + TO kk 167 166 166 166 168 16 Comparisons (n=100) I J < IF kk 1+ TO kk ENDIF 111 111 111 111 111 11 x I CELL[] @ x J CELL[] @ < IF kk 1+ TO kk ENDIF 188 187 187 189 187 18 Array Comparisons and Swaps (n=100) x I CELL[] @ x kk CELL[] @ < IF -1 ELSE 1 ENDIF TO kk 202 202 207 202 202 20 x I CELL[] x J CELL[] intcmp TO kk 186 186 186 186 186 18 I J swapmac 259 258 258 258 258 25 I J swapfunc 259 258 258 258 263 25 Max Function, Macro and Inline (n=100) I J MAX TO kk 176 176 176 176 176 17 I J maxmac TO kk 176 176 176 176 176 17 I J maxfunc TO kk 177 177 179 177 182 17 Math Functions (n=50) j S>F fi F+ TO fk 115 114 114 114 114 45 FRANDOM TO fk 115 115 115 115 115 46 j S>F fi F+ FSQRT TO fk 300 289 289 289 289 116 j S>F fi F+ FSIN TO fk 349 346 346 346 352 139 j S>F fi F+ FSINH TO fk 846 847 845 846 845 338 j S>F fi F+ FASIN TO fk 682 677 677 677 687 272 j S>F fi F+ FCOS TO fk 347 346 346 348 346 138 j S>F fi F+ FTAN TO fk 474 476 474 474 474 189 Memory Allocation (n=10) #16 ALLOCATE DROP FREE DROP 89 89 89 89 89 897 #100 ALLOCATE DROP FREE DROP 108 108 108 108 108 1085 #2000 ALLOCATE DROP FREE DROP 460 461 461 462 461 4592 Input and Output (n=10) idiot$ COUNT file WRITE-LINE THROW 549 556 549 550 556 6840 PAD 256 file READ-LINE THROW 2DROP 981 980 981 979 1144 9902 3485 ms elapsed. ok NDP Potential Exception: NDP SW = 0021 ( Gforth 0.4.9 ) Try: TIMES iForth Time Cost Model, n=100 Integer Arithmetic (n=100) ( ) 126 126 126 127 126 12 kk 1+ TO kk 417 416 416 417 416 41 I J + TO kk 456 456 457 456 456 45 i j - TO kk 467 466 466 466 492 47 i j * TO kk 546 546 549 546 546 54 i j / TO kk 956 947 946 947 946 94 i j MOD TO kk 951 936 937 938 936 93 i j AND TO kk 456 457 456 456 457 45 i j OR TO kk 456 456 456 457 456 45 Floating Point Arithmetic (n=100) j S>F fj F! 1151 1117 1124 1121 1117 112 j S>F fj F! fi F@ fj F@ F+ fk F! 2129 2132 2143 2118 2153 213 j S>F fj F! fi F@ fj F@ F- fk F! 2144 2137 2118 2118 2117 212 j S>F fj F! fi F@ fj F@ F* fk F! 2155 2117 2117 2118 2136 212 j S>F fj F! fi F@ fj F@ F/ fk F! 2468 2468 2470 2491 2467 247 Array Operations (n=100) i j + TO kk 456 473 456 456 489 46 i x []CELL @ j + TO kk 768 767 785 767 769 77 i j x []CELL @ + TO kk 758 759 758 1141 758 83 i x []CELL @ j x []CELL @ + TO kk 1081 1080 1079 3643 1079 159 Comparisons (n=100) I J < IF kk 1+ TO kk ENDIF 550 537 537 538 537 54 x I CELL[] @ x J CELL[] @ < IF kk 1+ TO kk ENDIF 1109 1070 1085 3252 1071 151 Array Comparisons and Swaps (n=100) x I CELL[] @ x kk CELL[] @ < IF -1 ELSE 1 ENDIF TO kk 1295 1295 1326 1298 1294 130 x I CELL[] x J CELL[] intcmp TO kk 1157 3132 1170 1149 1151 155 I J swapmac 1457 1424 1423 2445 1471 164 I J swapfunc 1587 1564 1563 1563 1862 162 Max Function, Macro and Inline (n=100) I J MAX TO kk 477 479 477 477 477 47 I J maxmac TO kk 478 477 477 478 477 47 I J maxfunc TO kk 843 844 843 844 843 84 Math Functions (n=50) j S>F fi F@ F+ fk F! 692 395 395 398 395 182 RANDOM S>F fk F! 536 537 536 538 536 214 j S>F fi F@ F+ FSQRT fk F! 610 608 609 608 608 243 j S>F fi F@ F+ FSIN fk F! 1103 1380 1085 1083 1084 459 j S>F fi F@ F+ FSINH fk F! 1157 1153 1190 1199 1153 468 j S>F fi F@ F+ FASIN fk F! 2058 1761 1761 1778 1761 729 j S>F fi F@ F+ FCOS fk F! 1357 1079 1080 1090 1079 454 j S>F fi F@ F+ FTAN fk F! 1397 1425 1399 1693 1399 585 Memory Allocation (n=10) 16 ALLOCATE DROP FREE DROP 30 28 28 28 28 287 100 ALLOCATE DROP FREE DROP 27 27 27 27 27 274 2000 ALLOCATE DROP FREE DROP 32 32 32 32 32 324 Input and Output (n=10) idiot$ COUNT file WRITE-LINE THROW 284 202 199 198 199 2166 PAD 256 file READ-LINE THROW 2DROP 1200 978 1222 972 979 10708 1184 ms elapsed ( Win32Forth 3.5 ) iForth Time Cost Model, n=100 Integer Arithmetic (n=100) ( ) 296 289 295 289 295 29 kk 1+ TO kk 655 656 655 656 655 65 I J + TO kk 886 885 886 895 885 88 i j - TO kk 1010 1011 1010 1011 1011 101 i j * TO kk 1086 1085 1086 1086 1085 108 i j / TO kk 2321 2329 2321 2321 2322 232 i j MOD TO kk 2742 2742 2747 2743 2743 274 i j AND TO kk 985 986 986 985 986 98 i j OR TO kk 1010 1010 1010 1016 1010 101 Floating Point Arithmetic (n=100) j S>F fj F! 2076 2088 2085 2091 2088 208 j S>F fj F! fi F@ fj F@ F+ fk F! 4044 4040 4034 4039 4047 404 j S>F fj F! fi F@ fj F@ F- fk F! 4090 4098 4103 4071 4090 409 j S>F fj F! fi F@ fj F@ F* fk F! 4004 4020 4019 3999 4010 401 j S>F fj F! fi F@ fj F@ F/ fk F! 4364 4344 4343 4341 4369 435 Array Operations (n=100) i j + TO kk 912 892 891 892 891 89 i x []CELL @ j + TO kk 1861 1861 1861 1861 1861 186 i j x []CELL @ + TO kk 1865 1857 1857 1857 1857 185 i x []CELL @ j x []CELL @ + TO kk 2751 2737 2743 2737 2762 274 Comparisons (n=100) I J < IF kk 1+ TO kk ENDIF 1627 1627 1627 1627 1627 162 x I CELL[] @ x J CELL[] @ < IF kk 1+ TO kk ENDIF 3003 3050 3042 3050 3050 303 Array Comparisons and Swaps (n=100) x I CELL[] @ x kk CELL[] @ < IF -1 ELSE 1 ENDIF TO kk 3366 3384 3376 3387 3342 337 x I CELL[] x J CELL[] intcmp TO kk 3475 3470 3470 3471 3478 347 I J swapmac 4954 4947 4945 4877 4948 493 I J swapfunc 5290 5228 5223 5226 5228 523 Max Function, Macro and Inline (n=100) I J MAX TO kk 1100 1100 1102 1102 1100 110 I J maxmac TO kk 1100 1113 1102 1101 1102 110 I J maxfunc TO kk 2481 2553 2554 2554 2553 253 Math Functions (n=50) j S>F fi F@ F+ fk F! 781 773 772 790 772 311 RANDOM S>F fk F! 986 986 987 986 986 394 j S>F fi F@ F+ FSQRT fk F! 1026 1024 1027 1026 1032 410 j S>F fi F@ F+ FSIN fk F! 2055 2059 2078 2087 2064 827 j S>F fi F@ F+ FSINH fk F! 2591 2597 2600 2606 2592 1039 j S>F fi F@ F+ FASIN fk F! 1350 1346 1352 1352 1353 540 j S>F fi F@ F+ FCOS fk F! 2054 2075 2097 2060 2077 829 j S>F fi F@ F+ FTAN fk F! 2396 2385 2422 2386 2386 958 Memory Allocation (n=10) 16 ALLOCATE DROP FREE DROP 242 236 242 239 255 2431 100 ALLOCATE DROP FREE DROP 246 248 242 233 253 2449 2000 ALLOCATE DROP FREE DROP 263 230 229 230 229 2366 Input and Output (n=10) idiot$ COUNT file WRITE-LINE THROW 865 3314 793 790 793 13112 PAD 256 file READ-LINE THROW 2DROP 1406 1384 1394 1389 1386 13923 2605 ms elapsed ok ( SwiftForth 2.2.2.9 ) INCLUDE C:\Program Files\ForthInc\SwiftForth\Lib\Samples\timemod.f Try: TIMES ok times iForth Time Cost Model, n=100 Integer Arithmetic (n=100) ( ) 81 80 80 80 80 8 kk 1+ TO kk 133 131 131 131 131 13 I J + TO kk 191 191 191 191 191 19 i j - TO kk 201 201 201 201 201 20 i j * TO kk 271 273 271 271 271 27 i j / TO kk 703 691 693 691 693 69 i j MOD TO kk 691 698 691 693 691 69 i j AND TO kk 202 191 191 191 191 19 i j OR TO kk 193 191 191 191 191 19 Floating Point Arithmetic (n=100) j S>F fj F! 962 964 962 964 973 96 j S>F fj F! fi F@ fj F@ F+ fk F! 1573 1572 1562 1562 1567 156 j S>F fj F! fi F@ fj F@ F- fk F! 1562 1571 1562 1562 1573 156 j S>F fj F! fi F@ fj F@ F* fk F! 1562 1574 1572 1562 1562 156 j S>F fj F! fi F@ fj F@ F/ fk F! 1870 1871 1872 1864 1862 186 Array Operations (n=100) i j + TO kk 190 190 190 190 190 19 i x []CELL @ j + TO kk 291 290 290 290 302 29 i j x []CELL @ + TO kk 291 304 291 291 303 29 i x []CELL @ j x []CELL @ + TO kk 391 391 393 391 391 39 Comparisons (n=100) I J < IF kk 1+ TO kk ENDIF 209 208 208 208 208 20 x I CELL[] @ x J CELL[] @ < IF kk 1+ TO kk ENDIF 396 394 394 394 396 39 Array Comparisons and Swaps (n=100) x I CELL[] @ x kk CELL[] @ < IF -1 ELSE 1 ENDIF TO kk 423 434 423 423 435 42 x I CELL[] x J CELL[] intcmp TO kk 421 423 421 421 421 42 I J swapmac 496 496 498 496 496 49 I J swapfunc 526 526 537 526 537 53 Max Function, Macro and Inline (n=100) I J MAX TO kk 218 218 218 232 218 22 I J maxmac TO kk 218 218 218 218 218 21 I J maxfunc TO kk 225 224 226 224 224 22 Math Functions (n=50) j S>F fi F@ F+ fk F! 281 283 281 281 281 112 RANDOM S>F fk F! 441 431 443 431 431 174 j S>F fi F@ F+ FSQRT fk F! 445 443 443 445 443 177 j S>F fi F@ F+ FSIN fk F! 1161 1161 1159 1170 1171 465 j S>F fi F@ F+ FSINH fk F! 1376 1378 1374 1377 1386 551 j S>F fi F@ F+ FASIN fk F! 2250 2239 2245 2238 2249 897 j S>F fi F@ F+ FCOS fk F! 1240 1240 1241 1241 1253 497 j S>F fi F@ F+ FTAN fk F! 844 845 832 834 832 335 Memory Allocation (n=10) 16 ALLOCATE DROP FREE DROP 82 80 80 80 82 811 100 ALLOCATE DROP FREE DROP 94 94 94 94 94 943 2000 ALLOCATE DROP FREE DROP 482 479 479 481 479 4804 Input and Output (n=10) idiot$ COUNT file WRITE-LINE THROW 665 3104 589 584 591 11067 PAD 256 file READ-LINE THROW 2DROP 720 721 710 707 708 7136 1356 ms elapsed ok *) ENDDOC DOC (* On AMD Athlon 900 MHz ( iForth 2.0 ) iForth Time Cost Model, n=100 Integer Arithmetic (n=100) ( ) 72 72 80 72 72 7 1 +TO kk 98 91 91 91 91 9 i j + TO kk 79 79 79 79 250 11 i j - TO kk 65 65 65 65 65 6 i j * TO kk 82 82 81 81 81 8 i j / TO kk 548 542 523 532 523 53 i j MOD TO kk 530 522 531 522 530 52 i j AND TO kk 65 65 65 65 65 6 i j OR TO kk 82 82 82 82 82 8 Floating Point Arithmetic (n=100) j S>F TO fj 105 106 106 106 106 10 j S>F TO fj fi fj F+ TO fk 138 139 139 147 139 14 j S>F TO fj fi fj F- TO fk 146 139 139 139 139 14 j S>F TO fj fi fj F* TO fk 138 139 139 167 139 14 j S>F TO fj fi fj F/ TO fk 172 172 180 172 172 17 Array Operations (n=100) i j + TO kk 79 79 79 79 79 7 i x []CELL @ j + TO kk 103 103 111 103 103 10 i j x []CELL @ + TO kk 63 63 63 63 63 6 i x []CELL @ j x []CELL @ + TO kk 109 221 109 109 109 13 Comparisons (n=100) I J < IF 1 +TO kk ENDIF 89 89 89 89 89 8 x I CELL[] @ x J CELL[] @ < IF 1 +TO kk ENDIF 152 151 151 151 160 15 Array Comparisons and Swaps (n=100) x I CELL[] @ x kk CELL[] @ < IF -1 ELSE 1 ENDIF TO kk 181 179 179 179 179 17 x I CELL[] x J CELL[] intcmp TO kk 117 109 109 109 109 11 I J swapmac 193 193 193 193 193 19 I J swapfunc 234 243 235 235 235 23 Max Function, Macro and Inline (n=100) I J MAX TO kk 73 73 84 73 73 7 I J maxmac TO kk 74 75 74 74 74 7 I J maxfunc TO kk 184 209 184 184 184 18 Math Functions (n=50) j S>F fi F+ TO fk 32 32 32 32 32 12 RANDOM S>F TO fk 56 49 49 49 49 20 j S>F fi F+ FSQRT TO fk 62 62 62 62 70 25 j S>F fi F+ FSIN TO fk 231 231 239 231 231 93 j S>F fi F+ FSINH TO fk 439 448 440 447 440 177 j S>F fi F+ FASIN TO fk 87 87 87 87 95 35 j S>F fi F+ FCOS TO fk 256 249 249 249 257 100 j S>F fi F+ FTAN TO fk 349 357 349 501 349 152 Memory Allocation (n=10) #16 ALLOCATE DROP FREE DROP 56 56 57 55 57 565 #100 ALLOCATE DROP FREE DROP 56 59 58 67 58 602 #2000 ALLOCATE DROP FREE DROP 108 109 109 109 109 1092 Input and Output (n=10) idiot$ COUNT file WRITE-LINE THROW 362 367 357 356 357 3602 PAD 256 file READ-LINE THROW 2DROP 485 479 487 479 508 4883 0.171 seconds elapsed. ( VFX ) iForth Time Cost Model, n=100 Integer Arithmetic (n=100) ( ) 284 73 73 73 73 11 kk 1+ TO kk 54 54 54 54 54 5 I J + TO kk 54 54 54 54 54 5 i j - TO kk 52 52 52 52 52 5 i j * TO kk 54 54 54 54 54 5 i j / TO kk 521 503 632 503 511 53 i j MOD TO kk 685 581 573 702 581 62 i j AND TO kk 54 54 54 54 54 5 i j OR TO kk 52 52 52 52 52 5 Floating Point Arithmetic (n=100) j S>F TO fj 174 181 174 174 174 17 j S>F TO fj fi fj F+ TO fk 343 335 335 342 335 33 j S>F TO fj fi fj F- TO fk 355 362 355 355 362 35 j S>F TO fj fi fj F* TO fk 335 343 335 335 343 33 j S>F TO fj fi fj F/ TO fk 498 505 498 505 506 50 Array Operations (n=100) i j + TO kk 69 69 69 76 69 7 i x []CELL @ j + TO kk 125 125 229 125 125 14 i j x []CELL @ + TO kk 85 85 85 108 85 9 i x []CELL @ j x []CELL @ + TO kk 175 175 175 182 175 17 Comparisons (n=100) I J < IF kk 1+ TO kk ENDIF 66 66 66 66 66 6 x I CELL[] @ x J CELL[] @ < IF kk 1+ TO kk ENDIF 337 227 227 234 227 25 Array Comparisons and Swaps (n=100) x I CELL[] @ x kk CELL[] @ < IF -1 ELSE 1 ENDIF TO kk 209 208 208 216 208 21 x I CELL[] x J CELL[] intcmp TO kk 155 155 155 163 155 15 I J swapmac 235 225 225 225 232 22 I J swapfunc 343 225 233 225 225 25 Max Function, Macro and Inline (n=100) I J MAX TO kk 112 119 112 111 111 11 I J maxmac TO kk 112 111 119 111 111 11 I J maxfunc TO kk 99 376 106 99 99 15 Math Functions (n=50) j S>F fi F+ TO fk 57 57 57 57 57 23 RANDOM S>F TO fk 50 57 49 49 49 20 j S>F fi F+ FSQRT TO fk 123 123 130 123 123 49 j S>F fi F+ FSIN TO fk 326 333 325 325 350 132 j S>F fi F+ FSINH TO fk 613 614 588 580 691 247 j S>F fi F+ FASIN TO fk 425 417 425 436 533 178 j S>F fi F+ FCOS TO fk 327 333 326 326 348 133 j S>F fi F+ FTAN TO fk 408 401 408 401 628 179 Memory Allocation (n=10) #16 ALLOCATE DROP FREE DROP 55 55 55 55 55 555 #100 ALLOCATE DROP FREE DROP 57 57 57 57 57 577 #2000 ALLOCATE DROP FREE DROP 108 108 108 115 108 1096 Input and Output (n=10) idiot$ COUNT file WRITE-LINE THROW 336 432 334 338 357 3598 PAD 256 file READ-LINE THROW 2DROP 518 510 517 519 511 5155 230 ms elapsed. ok NDP Potential Exception: NDP SW = 0021 ( SwiftForth doesn't work ) ( Gforth 0.4.9 ) Try: TIMES iForth Time Cost Model, n=100 Win32 Linux 0.4.9 0.5.0 Integer Arithmetic (n=100) ( ) 133 133 140 133 133 13 15 kk 1+ TO kk 396 396 403 396 404 39 28 I J + TO kk 393 400 393 400 393 39 28 i j - TO kk 393 400 393 393 400 39 28 i j * TO kk 393 393 400 393 460 40 30 i j / TO kk 810 810 853 810 811 81 72 i j MOD TO kk 825 810 810 810 810 81 72 i j AND TO kk 393 417 393 400 393 39 28 i j OR TO kk 393 400 393 400 393 39 28 Floating Point Arithmetic (n=100) j S>F fj F! 1621 1622 1663 1621 1621 163 746 j S>F fj F! fi F@ fj F@ F+ fk F! 3217 3239 3216 3313 3240 324 1571 j S>F fj F! fi F@ fj F@ F- fk F! 3483 3217 3224 3221 3239 327 1575 j S>F fj F! fi F@ fj F@ F* fk F! 3271 3234 3250 3271 3236 325 1571 j S>F fj F! fi F@ fj F@ F/ fk F! 3375 3368 3389 3380 3375 337 1586 Array Operations (n=100) i j + TO kk 400 393 400 393 393 39 27 i x []CELL @ j + TO kk 975 990 975 975 975 97 67 i j x []CELL @ + TO kk 974 974 989 974 974 97 66 i x []CELL @ j x []CELL @ + TO kk 1519 1527 1527 1520 1543 152 108 Comparisons (n=100) I J < IF kk 1+ TO kk ENDIF 494 486 499 486 509 49 32 x I CELL[] @ x J CELL[] @ < IF kk 1+ TO kk ENDIF 1584 1584 1619 1577 1600 159 117 Array Comparisons and Swaps (n=100) x I CELL[] @ x kk CELL[] @ < IF -1 ELSE 1 ENDIF TO kk 1841 1856 1841 1841 1841 184 131 x I CELL[] x J CELL[] intcmp TO kk 1883 1889 1874 1874 1889 188 140 I J swapmac 2654 2402 2410 2403 2402 245 170 I J swapfunc 2518 3053 2596 2518 2526 264 178 Max Function, Macro and Inline (n=100) I J MAX TO kk 395 403 674 396 395 45 30 I J maxmac TO kk 407 399 399 422 399 40 30 I J maxfunc TO kk 795 787 794 795 794 79 49 Math Functions (n=50) j S>F fi F@ F+ fk F! 560 560 553 560 553 223 894 RANDOM S>F fk F! 842 858 842 842 842 338 1180 j S>F fi F@ F+ FSQRT fk F! 681 681 680 673 680 271 913 j S>F fi F@ F+ FSIN fk F! 1302 1310 1308 1804 1325 564 918 j S>F fi F@ F+ FSINH fk F! 1363 1389 1370 1375 1384 550 1104 j S>F fi F@ F+ FASIN fk F! 928 928 991 928 928 376 1131 j S>F fi F@ F+ FCOS fk F! 1276 1268 1268 1276 1268 508 917 j S>F fi F@ F+ FTAN fk F! 1422 1415 1437 1414 1422 568 918 Memory Allocation (n=10) 16 ALLOCATE DROP FREE DROP 25 33 25 25 25 274 413 100 ALLOCATE DROP FREE DROP 24 24 24 24 24 249 412 2000 ALLOCATE DROP FREE DROP 30 30 30 30 30 309 402 Input and Output (n=10) idiot$ COUNT file WRITE-LINE THROW 139 135 136 132 144 1375 2492 PAD 256 file READ-LINE THROW 2DROP 602 608 609 600 632 6108 17017 1013 ms elapsed ( Win32Forth ) times iForth Time Cost Model, n=100 Integer Arithmetic (n=100) ( ) 102 111 103 103 103 10 kk 1+ TO kk 308 309 316 308 316 31 I J + TO kk 345 517 347 354 346 38 i j - TO kk 326 336 327 353 327 33 i j * TO kk 346 354 346 355 348 35 i j / TO kk 950 951 1606 951 950 108 i j MOD TO kk 1054 952 951 950 950 97 i j AND TO kk 346 347 354 347 354 35 i j OR TO kk 336 937 336 423 336 47 Floating Point Arithmetic (n=100) j S>F fj F! 685 670 661 669 669 67 j S>F fj F! fi F@ fj F@ F+ fk F! 2147 2244 2158 2134 2133 216 j S>F fj F! fi F@ fj F@ F- fk F! 2142 2292 2143 2150 2143 217 j S>F fj F! fi F@ fj F@ F* fk F! 2175 2231 2423 2161 2171 223 j S>F fj F! fi F@ fj F@ F/ fk F! 2286 2297 2303 2287 2465 232 Array Operations (n=100) i j + TO kk 345 347 346 354 346 34 i x []CELL @ j + TO kk 808 809 809 809 801 80 i j x []CELL @ + TO kk 809 811 810 818 818 81 i x []CELL @ j x []CELL @ + TO kk 1290 1299 1292 1298 1307 129 Comparisons (n=100) I J < IF kk 1+ TO kk ENDIF 470 471 463 471 463 46 x I CELL[] @ x J CELL[] @ < IF kk 1+ TO kk ENDIF 1455 1465 1464 1561 1465 148 Array Comparisons and Swaps (n=100) x I CELL[] @ x kk CELL[] @ < IF -1 ELSE 1 ENDIF TO kk 1587 1490 1498 1498 1490 151 x I CELL[] x J CELL[] intcmp TO kk 1608 1610 1712 1604 1619 163 I J swapmac 1906 1938 1810 1859 1810 186 I J swapfunc 1923 1926 2053 2035 1925 197 Max Function, Macro and Inline (n=100) I J MAX TO kk 328 336 345 985 337 46 I J maxmac TO kk 335 328 336 328 328 33 I J maxfunc TO kk 660 654 662 678 661 66 Math Functions (n=50) j S>F fi F@ F+ fk F! 344 352 345 352 345 139 RANDOM S>F fk F! 516 510 518 510 511 205 j S>F fi F@ F+ FSQRT fk F! 412 432 420 420 420 168 j S>F fi F@ F+ FSIN fk F! 1107 1166 1101 1100 1211 454 j S>F fi F@ F+ FSINH fk F! 1202 1197 1225 1196 1196 481 j S>F fi F@ F+ FASIN fk F! 900 901 901 918 1007 370 j S>F fi F@ F+ FCOS fk F! 1101 1122 1110 1110 1103 443 j S>F fi F@ F+ FTAN fk F! 1308 1317 1309 1489 1311 538 Memory Allocation (n=10) 16 ALLOCATE DROP FREE DROP 260 277 302 312 303 2912 100 ALLOCATE DROP FREE DROP 334 324 319 325 301 3210 2000 ALLOCATE DROP FREE DROP 325 339 328 320 320 3269 Input and Output (n=10) idiot$ COUNT file WRITE-LINE THROW 469 443 433 438 426 4420 PAD 256 file READ-LINE THROW 2DROP 786 795 791 801 855 8059 851 ms elapsed ok ( iForth 2.0 on Linux ) Try: TIMES iForth Time Cost Model, n=100 Integer Arithmetic (n=100) ( ) 72 72 72 72 72 7 1 +TO kk 91 91 91 91 91 9 i j + TO kk 79 79 79 79 79 7 i j - TO kk 90 65 65 65 65 7 i j * TO kk 82 82 82 82 82 8 i j / TO kk 522 522 522 522 522 52 i j MOD TO kk 522 522 522 522 522 52 i j AND TO kk 65 65 65 65 65 6 i j OR TO kk 82 82 82 82 82 8 Floating Point Arithmetic (n=100) j S>F TO fj 105 105 105 105 105 10 j S>F TO fj fi fj F+ TO fk 169 169 169 169 169 16 j S>F TO fj fi fj F- TO fk 169 169 169 169 169 16 j S>F TO fj fi fj F* TO fk 169 169 169 169 169 16 j S>F TO fj fi fj F/ TO fk 212 212 212 212 212 21 Array Operations (n=100) i j + TO kk 79 79 79 79 79 7 i x []CELL @ j + TO kk 103 103 103 103 103 10 i j x []CELL @ + TO kk 63 63 63 63 63 6 i x []CELL @ j x []CELL @ + TO kk 109 109 109 109 109 10 Comparisons (n=100) I J < IF 1 +TO kk ENDIF 89 89 89 89 89 8 x I CELL[] @ x J CELL[] @ < IF 1 +TO kk ENDIF 154 152 152 152 152 15 Array Comparisons and Swaps (n=100) x I CELL[] @ x kk CELL[] @ < IF -1 ELSE 1 ENDIF TO kk 179 179 179 179 179 17 x I CELL[] x J CELL[] intcmp TO kk 109 109 109 109 109 10 I J swapmac 193 193 193 193 193 19 I J swapfunc 234 234 234 234 234 23 Max Function, Macro and Inline (n=100) I J MAX TO kk 65 65 65 65 65 6 I J maxmac TO kk 66 66 80 66 66 6 I J maxfunc TO kk 184 184 184 184 184 18 Math Functions (n=50) j S>F fi F+ TO fk 35 35 35 35 35 14 RANDOM S>F TO fk 49 50 50 50 50 20 j S>F fi F+ FSQRT TO fk 82 82 82 82 82 33 j S>F fi F+ FSIN TO fk 231 231 231 231 231 92 j S>F fi F+ FSINH TO fk 434 434 434 434 434 173 j S>F fi F+ FASIN TO fk 84 84 84 84 84 33 j S>F fi F+ FCOS TO fk 249 249 540 249 249 123 j S>F fi F+ FTAN TO fk 349 349 349 349 349 139 Memory Allocation (n=10) #16 ALLOCATE DROP FREE DROP 82 82 82 82 82 826 #100 ALLOCATE DROP FREE DROP 82 82 82 82 82 825 #2000 ALLOCATE DROP FREE DROP 82 82 82 82 82 821 Input and Output (n=10) idiot$ COUNT file WRITE-LINE THROW 614 644 642 629 656 6376 PAD 256 file READ-LINE THROW 2DROP 519 488 486 467 472 4871 0.189 seconds elapsed. *) ENDDOC 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 =: MAXN CREATE x MAXN CELLS ALLOT #100 VALUE startn \ FUNCTIONS TO BE TIMED :INLINE intcmp ( 'i 'j -- u ) >R @ R> @ - ; :INLINE swapmac ( i j -- ) x []CELL >R x []CELL DUP @ R@ @ ROT ! R> ! ; : swapfunc ( i j -- ) x []CELL >R x []CELL DUP @ R@ @ ROT ! R> ! ; :INLINE maxmac ( a b -- u ) MAX ; : maxfunc ( a b -- u ) 2DUP > IF NIP ELSE DROP ENDIF ; \ WORKHORSE : T" S~ CR CR ." ~ &" $+ S~ (n=" n 0 .R &) EMIT~ $+ EVALUATE ; IMMEDIATE #15 =: STRIALS #20 =: TRIALS : M" ( -- ) >IN @ >R &" POSTPONE SLITERAL R> >IN ! S" CR #55 OVER - >S TYPE S> SPACES " EVALUATE S" CLEAR kk CLEAR 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 &" 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 +TO tsum " EVALUATE S" LOOP " EVALUATE S" tsum n n * TRIALS STRIALS - * " EVALUATE S" / 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 S" tm.dat" R/W BIN CREATE-FILE THROW TO file CR ." iForth Time Cost Model, n=" n DEC. TIMER-RESET T" Integer Arithmetic" M" ( )" M" 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 1 +TO kk ENDIF" M" x I CELL[] @ x J CELL[] @ < IF 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" tm.dat" R/W BIN CREATE-FILE THROW TO file M" idiot$ COUNT file WRITE-LINE THROW" file CLOSE-FILE THROW S" 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 -timemod CR (* End of Source *)