home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / programming / forthmacs / tools1 / !Forthmacs / extend / runtime < prev    next >
Encoding:
Text File  |  1995-11-25  |  5.0 KB  |  142 lines

  1. \ portable RUNTIME PROFILER  Version 1.03
  2. \ USE:  -- runtime-profiling of colon definitions.
  3. \ mini manual:
  4. \ 1) load the cpu specific runtimer file, this file should be loaded automatically.
  5. \       fload extend\??cpu??\runtimer.fth
  6. \       fload extend\runtime.fth
  7. \ 2) From now on all colon definitions have an internal time measuring code part which is
  8. \       executed by calling the word.
  9. \ 3) Glossary:
  10. \ new ( -- )
  11. \       clear all timing information
  12. \ .times ( -- )
  13. \       display timing information
  14. \ profile ( -- ) name
  15. \       the word name is executed and the timing takes place. name could be a "benchmark" or
  16. \       the timing critical part of your application.       
  17. \ see   is patched, it will give correct information and knows about the timer information data
  18. \       structure
  19. \
  20. \ 4) example
  21. \ : test1       dup dup dup ;
  22. \ : test2       drop drop drop ;
  23. \ : test3       swap swap swap ;
  24. \ : test4       test1 test3 test2 test1 test3 test2 ;
  25. \ : test5       10000 0 do test4 test4 loop ;
  26. \ profile test5 .times
  27.  
  28. \
  29. \ User words of runtimer Version 1.0
  30. \       new (-- )             set all calls and ticks to 0
  31. \       .times ( -- )         print runtimes
  32. \       profile  name ( -- )  make a runtime profile of word name)
  33. \ Lit.  [1] "Laufzeitmessung von Forthworten", Bernd Pennemann, VD2/87
  34. \       [2] Formacs User's Guide, Mitch Bradley 
  35. \
  36. \ After loading the runtimer every colon definition is linked by an extra
  37. \ link-list for easy finding of all words.
  38.  
  39. \ Structure of new colon definition:
  40. \       timer-link-list long
  41. \       standard forthmacs header
  42. \       apf parameter field address of word
  43. \        0 (time
  44. \        4 calls
  45. \        8 #time
  46. \       12 compiled code continues ......
  47.  
  48. only forth also hidden also definitions  decimal
  49.  
  50. ifdef   profile                 \ this file shouldn't be compiled twice
  51.         ??cr error-output .( don't load runtimer twice ! )  cr restore-output fexit
  52. ifend
  53.  
  54. ifndef  (time                   \ defined in cpu-specific file
  55.         ??cr error-output .( needs cpu-specific runtimer-file first!)
  56.         restore-output cr abort
  57. ifend
  58. \needs /cell    alias /cell /n
  59. \needs cell+    alias cell+ na1+
  60.  
  61. variable timer-link             \ base of link-list bound to 0
  62.         here timer-link link!  0 ,
  63. variable used-time
  64. defer scan-action               \ ( anf -- )
  65.  
  66. ms/tick td 1000 * constant usec/tick    \ 100hz ticker
  67. : scan-all      \ ( -- ) scan-action is done with all timer-linked words
  68.     timer-link
  69.     begin    link@ dup link@  exit? not and
  70.     while    dup cell+  l>name   scan-action
  71.     repeat    drop ;
  72.  
  73. : ticker-data   \ ( anf -- adr-timer adr-data )
  74.     name> >body cell+ dup cell+ swap ;
  75. : new-data      \ ( anf -- ) Call-nr und Time-nr  = 0
  76.     ticker-data off off  used-time off ;
  77. : legal-data    \ ( anf -- )
  78.     ticker-data drop @ 2-  used-time @ >
  79.     if used-time off then ;
  80. : .percent      \ ( n -- )
  81.     used-time @ dup 100000 >
  82.     if 100 / else swap 1005 * 10 / swap then /      ( n -- )
  83.     ?dup if 4 .r else ."  < 1" then ." %" ;
  84.  
  85. : .usec         \ ( usec -- )
  86.     dup 30000 >
  87.     if    499 +  1000 /  [char] m >r  dup 30000 >
  88.         if 499 +  1000 /  r> drop  bl >r  then
  89.     else    [char] u >r
  90.     then    ( n -- )
  91.     ?dup if 8 .r else ."        -" then  space r> emit  ." sec" ;
  92. : .one-data     \ ( anf -- ) prints data of one word
  93.     dup ticker-data @  swap @ swap
  94.     dup 0=  ( anf #time calls flag )
  95.     if 2drop drop exit then
  96.     rot .id  20 to-column
  97.     2dup   8 .r ."  Calls"    usec/tick * .usec
  98.     2dup swap usec/tick * swap /  .usec ." /call"
  99.     drop  used-time @
  100.     if  .percent else drop then ??cr ;
  101.  
  102. \ support for the decompiler
  103. ifdef see
  104.     : .runtime-info        ( ip -- ip' )
  105.         +indent .." \ <-- profiler-information available, "
  106.         cell+ dup @ .d ." calls, " cell+ dup @ .d ." ticks." cell+ -indent ;
  107.     : skip-runtime-info     ( ip -- ip' )
  108.         cell+ cell+ cell+ ;
  109.     ' (time ' .runtime-info  ' skip-runtime-info  install-decomp
  110. ifend
  111.                 
  112. : (forget       true abort" forget is not allowed with profiler loaded!" ;
  113. : (save-forth   true abort" save-forth is not allowed with profiler loaded!" ; 
  114.         ' (forget     ' forget >body token!
  115.         ' (save-forth ' save-forth >body token!
  116.  
  117. forth definitions
  118.  
  119. variable runtimer  runtimer off     \ on -> the runtimer code is compiled
  120. : new           \ ( -- ) set all ticks and calls to 0
  121.         ['] new-data is scan-action  scan-all ;
  122. : .times        \ ( -- ) prints data of all words
  123.         ??cr cr ." Runtime profiler V 1.03 (c) 1993,94 Hanno Schwalm"
  124.         cr #columns 0 do [char] _ emit loop cr cr
  125.         ['] legal-data is scan-action scan-all
  126.         ['] .one-data is scan-action
  127.         base @ >r decimal scan-all  r> base !
  128.         cr #columns 0 do [char] _ emit loop cr cr ;
  129.  
  130. : profile       \ name ( -- ) make runtime-profile of name
  131.         new '
  132.         get-ticks >r execute get-ticks r> -  used-time ! ;
  133.  
  134. : :             \ name ( -- ) redefined colon, using runtimer
  135.         runtimer @ 0= if :  exit then
  136.         here  timer-link link@ link,  timer-link link!
  137.         :            \ make a colon definition
  138.         postpone (time 0 , 0 , ; immediate
  139.  
  140. only  forth also  definitions  decimal
  141. runtimer on
  142.