Hi Gambit List,
I've got a gambit program which includes some C code for searching memory mapped files and I was wondering how best to profile it. I've used statprof, but since it works using gambit interrupts it doesn't statistically highlight time spent in functions containing C code.
I've been using a 'define-timed' macro I wrote (see below) which records the accumulated wall-time a function uses. This is fine, but it means you have to instrument each function manually (by changing '(define (foo) ..) to '(define-timed (foo) ..)' which is a bit sucky.
Could this be modified to instrument each function automatically? (I tried redefining 'define' but couldn't get this to work cleanly) Is there a better way?
Many thanks,
Phil
---------
(define *timerhash* (make-table))
(define (reset-timer) (set! *timerhash* (make-table)))
(define (accum-time name thunk) (let* ((timebefore (real-time)) (res (thunk))) (table-set! *timerhash* name (+ (table-ref *timerhash* name 0) (- (real-time) timebefore))) res))
(define (get-times) (map (lambda (e) (set! total (+ total (cdr e))) (cons (car e) (* 1000 (cdr e)))) (sort-list (table->list *timerhash*) (lambda (a b) (> (cdr a) (cdr b))))))
(define-syntax define-timed (syntax-rules () ((define-timed (name . args) body ...) (define (name . args) (accum-time 'name (lambda () body ...))) )))
--------
Usage:
(define-timed (myfunction) (do stuff))
(reset-timer) ;...do stuff (myfunction) ;... (get-times)