Profiler

Sometimes it is useful to watch a word working. The Tracer gives many informations, which may be confusing or un-usable at all. The number of calls of a given word can be more instructive. This is the time for the profiler utility.

variable profiling?
: profile:on -1 profiling? ! ;
: profile:off 0 profiling? ! ;

: profiler profiling? @ if 1 swap +! else drop then ;
\ re-define colon
: : :
  here 2 allot postpone literal postpone profiler
;

\ get the address of the profiling data.
: xt>prf ( xt -- addr )
 cell+ @i
;

After loading it into the controller, every colon word gets a counter (1 cell) which is incremented every time the word is called. Since this cell can be used like any variable, it can be reset any time as well.

> : foo 1 ;
 ok
> profiler:on
 ok
> ' foo xt>prf @ .
0 ok
> foo
 ok
> ' foo xt>prf @ .
1 ok
> 0 ' foo xt>prf !
ok
>