This page is about benchmarking Tcl's proc vs Itcl based code to see how much oveerhead Itcl adds and how to make it's performance better.
I decided to compare plain Tcl recursive calling vs Itcl inheriting, using chain and delegating.
If Itcl class has no variables and procs do not use any variables:
ITcl: Chain 10 level deep 51.347 ITcl: Chain 11 level deep 55.769 ITcl: Chain 12 level deep 61.921 ITcl: Chain 13 level deep 72.064 ITcl: Chain 14 level deep 76.513 ITcl: Chain 15 level deep 77.732 ITcl: Chain 16 level deep 84.874 ITcl: Chain 17 level deep 91.932 ITcl: Chain 18 level deep 121.868 ITcl: Chain 19 level deep 114.08 ITcl: Chain 20 level deep 108.025 ITcl: Delegate 10 level deep 32.479 ITcl: Delegate 11 level deep 36.436 ITcl: Delegate 12 level deep 39.776 ITcl: Delegate 13 level deep 41.741 ITcl: Delegate 14 level deep 45.113 ITcl: Delegate 15 level deep 49.032 ITcl: Delegate 16 level deep 52.265 ITcl: Delegate 17 level deep 54.443 ITcl: Delegate 18 level deep 93.945 ITcl: Delegate 19 level deep 71.611 ITcl: Delegate 20 level deep 70.01 ITcl: Inherit 10 level deep 25.959 ITcl: Inherit 11 level deep 28.699 ITcl: Inherit 12 level deep 31.088 ITcl: Inherit 13 level deep 33.196 ITcl: Inherit 14 level deep 35.765 ITcl: Inherit 15 level deep 38.178 ITcl: Inherit 16 level deep 44.797 ITcl: Inherit 17 level deep 43.085 ITcl: Inherit 18 level deep 54.318 ITcl: Inherit 19 level deep 47.477 ITcl: Inherit 20 level deep 50.636 Tcl: Recursive 10 level deep 10.403 Tcl: Recursive 11 level deep 11.743 Tcl: Recursive 12 level deep 12.324 Tcl: Recursive 13 level deep 14.245 Tcl: Recursive 14 level deep 14.721 Tcl: Recursive 15 level deep 16.241 Tcl: Recursive 16 level deep 16.997 Tcl: Recursive 17 level deep 17.485 Tcl: Recursive 18 level deep 18.763 Tcl: Recursive 19 level deep 22.154 Tcl: Recursive 20 level deep 21.667
So it seems that inheriting and calling methods from the same object seems to be the fastest way and using chan is the worst way.
Now, the tclbench based test that did the trick:
package require Itcl set itclvars 0 set minlevel 10 set maxlevel 20 set iter 10000 proc ::level1 {a b c d e} { } itcl::class ::class1 { public method level1 {a b c d e} { return 1 } } itcl::class ::classI1 { inherit ::class1 } itcl::class ::classD1 { inherit ::class1 } itcl::class ::classC1 { public method level {a b c d e} { return 1 } } for {set i 2} {$i <= $maxlevel} {incr i} { set varcode "" set varproccode "" set varitclcode "" set varlist [list] for {set j 0} {$j < $itclvars} {incr j} { set vn v${i}c${j} lappend varlist $vn append varcode "protected variable $vn 0" \n set ::$vn 0 append varproccode "incr ::$vn" \n append varitclcode "incr $vn" \n } set ip [expr {$i-1}] proc ::level$i {a b c d e} "$varproccode \; return \[::level$ip \$a \$b \$c \$d \$e\]" itcl::class ::classD$i " $varcode public method level$i \{a b c d e\} \{ $varitclcode return \[::oD$ip level$ip \$a \$b \$c \$d \$e\] \} " itcl::class ::classI$i "inherit ::classI$ip $varcode public method level$i \{a b c d e\} \{ $varitclcode return \[level$ip \$a \$b \$c \$d \$e\] \} " itcl::class ::classC$i "inherit ::classC$ip $varcode public method level \{a b c d e\} \{ $varitclcode return \[chain \$a \$b \$c \$d \$e\] \} " } for {set i 1} {$i <= $maxlevel} {incr i} { ::classI$i ::oI$i ::classD$i ::oD$i ::classC$i ::oC$i } if {[catch { ::oI$maxlevel level$maxlevel 1 2 3 4 5 ::oD$maxlevel level$maxlevel 1 2 3 4 5 ::oC2 level 1 2 3 4 5 ::level2 1 2 3 4 5 }]} { puts stderr $::errorInfo exit 1 } for {set i $minlevel} {$i <= $maxlevel} {incr i} { bench -desc "Tcl: Recursive [format %2d $i] level deep" -iter $iter \ -body "::level$i a b c d e" bench -desc "ITcl: Inherit [format %2d $i] level deep" -iter $iter \ -body "::oI$i level$i a b c d e" bench -desc "ITcl: Delegate [format %2d $i] level deep" -iter $iter \ -body "::oD$i level$i a b c d e" bench -desc "ITcl: Chain [format %2d $i] level deep" -iter $iter \ -body "::oC$i level a b c d e" }
If someone wishes to make improvements ot the code, please also update the benchmarks.