[gambit-list] Profiling scheme + C programs

Phil Dawes pdawes at users.sf.net
Fri Jun 15 04:54:53 EDT 2007


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)






More information about the Gambit-list mailing list