Version 1 of namespace size

Updated 2005-11-16 15:16:53

Richard Suchenwirth 2005-11-16 - Hunting for leaks in our software, I could not use the TCL_MEM_DEBUG mechanism. But the following code gives an approximate size in bytes consumed by the variables and children of a Tcl namespace (of which ::, the global namespace, is of particular interest - all its (grand)*children are also added). If you call this proc repeatedly, you can observe whether data are piling up:

 proc namespace'size ns {
   set sum [expr wide(0)]
   foreach var [info vars ${ns}::*] {
       if {[info exists $var]} {
           upvar #0 $var v
           if {[array exists v]} {
               incr sum [string bytelength [array get v]]
           } else {
               incr sum [string bytelength $v]
           }
       }
   }
   foreach child [namespace children $ns] {
       incr sum [namespace'size $child]
   }
   set sum
 }

Usage example:

 % puts [namespace'size ::]
 179914

JMN 2005-11-16 Modified (added 'info exists $var' if block)to account for case where var 'exists' but has not been initialised - e.g namespace eval ::something {variable x}


Category Debugging - Arts and crafts of Tcl-Tk programming