Version 6 of Profiling a TclOO class

Updated 2010-09-16 10:00:05 by dkf

tjk: I noticed the following example on comp.lang.tcl and thought that it was

  1. A good example of how to use the TclOO filter command
  2. A useful example in its own right

so I decided it was worth preserving on the wiki.


Fredrik wrote: sorry if this is a stupid question, but I would like to get into profiling of some of my TclOO classes, i.e. some use cases for their methods. Now, I see that the Tcllib profiler package redefines the "proc" command to do the dynamic source code analysis. Now, would that behave anywhere near correctly on a TclOO object method call?

DKF responded: No.

Frederick: If not, which I would guess is the case, are there alternatives which would work?

DKF: Mix in some kind of interceptor class into an object you want to watch, like this:

oo::class create interceptor {
    filter INTERCEPT
    method INTERCEPT args {
        set t [time {
            catch {next {*}$args} msg opts
        }]
        puts "[lindex $t 0]µs for [lindex $args 0] on [self]"
        return -options $opts $msg
    }
}

# A silly example class
oo::class create example {
    method bar x {
        for {set i 0} {$i<$x} {incr i} {
            incr out $i
        }
        return $out
    }
}
example create foo
puts [foo bar 500]

# Attach the instrumentation and rerun with a little profiling...
oo::objdefine foo mixin interceptor
puts [foo bar 500]

OK, that's a very noddy example but it shows how to do it.

Donal.