PageRenderTime 43ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/fth/bench.fth

https://github.com/cataska/pforth
Forth | 198 lines | 176 code | 22 blank | 0 comment | 0 complexity | d183a4ab8403cf86a00a80fe1bbfa7c1 MD5 | raw file
  1. \ @(#) bench.fth 97/12/10 1.1
  2. \ Benchmark Forth
  3. \ by Phil Burk
  4. \ 11/17/95
  5. \
  6. \ pForthV9 on Indy, compiled with gcc
  7. \ bench1 took 15 seconds
  8. \ bench2 took 16 seconds
  9. \ bench3 took 17 seconds
  10. \ bench4 took 17 seconds
  11. \ bench5 took 19 seconds
  12. \ sieve took 4 seconds
  13. \
  14. \ Darren Gibbs reports that on an SGI Octane loaded with multiple users:
  15. \ bench1 took 2.8sec
  16. \ bench2 took 2.7
  17. \ bench3 took 2.9
  18. \ bench4 took 2.1
  19. \ bench 5 took 2.5
  20. \ seive took .6
  21. \
  22. \ HForth on Mac Quadra 800, 68040
  23. \ bench1 took 1.73 seconds
  24. \ bench2 took 6.48 seconds
  25. \ bench3 took 2.65 seconds
  26. \ bench4 took 2.50 seconds
  27. \ bench5 took 1.91 seconds
  28. \ sieve took 0.45 seconds
  29. \
  30. \ pForthV9 on Mac Quadra 800
  31. \ bench1 took 40 seconds
  32. \ bench2 took 43 seconds
  33. \ bench3 took 43 seconds
  34. \ bench4 took 44 seconds
  35. \ bench5 took 42 seconds
  36. \ sieve took 20 seconds
  37. \
  38. \ pForthV9 on PB5300, 100 MHz PPC 603 based Mac Powerbook
  39. \ bench1 took 8.6 seconds
  40. \ bench2 took 9.0 seconds
  41. \ bench3 took 9.7 seconds
  42. \ bench4 took 8.8 seconds
  43. \ bench5 took 10.3 seconds
  44. \ sieve took 2.3 seconds
  45. \
  46. \ HForth on PB5300
  47. \ bench1 took 1.1 seconds
  48. \ bench2 took 3.6 seconds
  49. \ bench3 took 1.7 seconds
  50. \ bench4 took 1.2 seconds
  51. \ bench5 took 1.3 seconds
  52. \ sieve took 0.2 seconds
  53. anew task-bench.fth
  54. decimal
  55. \ benchmark primitives
  56. create #do 2000000 ,
  57. : t1 #do @ 0 do loop ;
  58. : t2 23 45 #do @ 0 do swap loop 2drop ;
  59. : t3 23 #do @ 0 do dup drop loop drop ;
  60. : t4 23 45 #do @ 0 do over drop loop 2drop ;
  61. : t5 #do @ 0 do 23 45 + drop loop ;
  62. : t6 23 #do @ 0 do >r r> loop drop ;
  63. : t7 23 45 67 #do @ 0 do rot loop 2drop drop ;
  64. : t8 #do @ 0 do 23 2* drop loop ;
  65. : t9 #do @ 10 / 0 do 23 5 /mod 2drop loop ;
  66. : t10 #do #do @ 0 do dup @ drop loop drop ;
  67. : foo ( noop ) ;
  68. : t11 #do @ 0 do foo loop ;
  69. \ more complex benchmarks -----------------------
  70. \ BENCH1 - sum data ---------------------------------------
  71. create data1 23 , 45 , 67 , 89 , 111 , 222 , 333 , 444 ,
  72. : sum.cells ( addr num -- sum )
  73. 0 swap \ sum
  74. 0 DO
  75. over \ get address
  76. i cells + @ +
  77. LOOP
  78. swap drop
  79. ;
  80. : bench1 ( -- )
  81. 200000 0
  82. DO
  83. data1 8 sum.cells drop
  84. LOOP
  85. ;
  86. \ BENCH2 - recursive factorial --------------------------
  87. : factorial ( n -- n! )
  88. dup 1 >
  89. IF
  90. dup 1- recurse *
  91. ELSE
  92. drop 1
  93. THEN
  94. ;
  95. : bench2 ( -- )
  96. 200000 0
  97. DO
  98. 10 factorial drop
  99. LOOP
  100. ;
  101. \ BENCH3 - DEFER ----------------------------------
  102. defer calc.answer
  103. : answer ( n -- m )
  104. dup +
  105. $ a5a5 xor
  106. 1000 max
  107. ;
  108. ' answer is calc.answer
  109. : bench3
  110. 1500000 0
  111. DO
  112. i calc.answer drop
  113. LOOP
  114. ;
  115. \ BENCH4 - locals ---------------------------------
  116. : use.locals { x1 x2 | aa bb -- result }
  117. x1 2* -> aa
  118. x2 2/ -> bb
  119. x1 aa *
  120. x2 bb * +
  121. ;
  122. : bench4
  123. 400000 0
  124. DO
  125. 234 567 use.locals drop
  126. LOOP
  127. ;
  128. \ BENCH5 - string compare -------------------------------
  129. : match.strings { $s1 $s2 | adr1 len1 adr2 len2 -- flag }
  130. $s1 count -> len1 -> adr1
  131. $s2 count -> len2 -> adr2
  132. len1 len2 -
  133. IF
  134. FALSE
  135. ELSE
  136. TRUE
  137. len1 0
  138. DO
  139. adr1 i + c@
  140. adr2 i + c@ -
  141. IF
  142. drop FALSE
  143. leave
  144. THEN
  145. LOOP
  146. THEN
  147. ;
  148. : bench5 ( -- )
  149. 60000 0
  150. DO
  151. " This is a string. X foo"
  152. " This is a string. Y foo" match.strings drop
  153. LOOP
  154. ;
  155. \ SIEVE OF ERATOSTHENES from BYTE magazine -----------------------
  156. DECIMAL 8190 CONSTANT TSIZE
  157. VARIABLE FLAGS TSIZE ALLOT
  158. : <SIEVE> ( --- #primes ) FLAGS TSIZE 1 FILL
  159. 0 TSIZE 0
  160. DO ( n ) I FLAGS + C@
  161. IF I DUP + 3 + DUP I + ( I2*+3 I3*+3 )
  162. BEGIN DUP TSIZE < ( same flag )
  163. WHILE 0 OVER FLAGS + C! ( i' i'' ) OVER +
  164. REPEAT 2DROP 1+
  165. THEN
  166. LOOP ;
  167. : SIEVE ." 10 iterations " CR 0 10 0
  168. DO <SIEVE> swap drop
  169. LOOP . ." primes " CR ;
  170. : SIEVE50 ." 50 iterations " CR 0 50 0
  171. DO <SIEVE> swap drop
  172. LOOP . ." primes " CR ;
  173. \ 10 iterations
  174. \ 21.5 sec Amiga Multi-Forth Indirect Threaded
  175. \ 8.82 sec Amiga 1000 running JForth
  176. \ ~5 sec SGI Indy running pForthV9