ref: ad50f75a7c9276fa04a0e91c54be24d2cec74b28
dir: /test/test.lsp/
(let ((*profiles* (table)))
(set! profile
(λ (s)
(let ((f (top-level-value s)))
(put! *profiles* s (cons 0 0))
(set-top-level-value! s
(λ args
(def tt (get *profiles* s))
(def count (car tt))
(def time (cdr tt))
(def t0 (time-now))
(def v (apply f args))
(set-cdr! tt (+ time (- (time-now) t0)))
(set-car! tt (+ count 1))
v)))))
(set! show-profiles
(λ ()
(def pr (filter (λ (x) (> (cadr x) 0))
(table-pairs *profiles*)))
(def width (+ 4
(apply max
(map (λ (x)
(length (string x)))
(cons 'Function
(map car pr))))))
(princ (string-rpad "Function" width #\ )
"#Calls Time (seconds)")
(newline)
(princ (string-rpad "--------" width #\ )
"------ --------------")
(newline)
(for-each
(λ (p)
(princ (string-rpad (string (caddr p)) width #\ )
(string-rpad (string (cadr p)) 11 #\ )
(car p))
(newline))
(simple-sort (map (λ (l) (reverse (to-proper l)))
pr)))))
(set! clear-profiles
(λ ()
(for-each (λ (k)
(put! *profiles* k (cons 0 0)))
(table-keys *profiles*)))))
#;(for-each profile
'(emit encode-byte-code const-to-idx-vec
index-of lookup-sym in-env? any every
compile-sym compile-if compile-begin
compile-arglist expand builtin->instruction
compile-app separate nconc get-defined-vars
compile-in compile compile-f delete-duplicates
map length> length= count filter append
lastcdr to-proper reverse reverse! list->vector
taboreach list-head list-tail assq memq assoc member
assv memv nreconc bq-process))