Annotation of micropolis/src/tclx/tclsrc/profrep.tcl, revision 1.1.1.1

1.1       root        1: #
                      2: # profrep  --
                      3: #
                      4: # Generate Tcl profiling reports.
                      5: #------------------------------------------------------------------------------
                      6: # Copyright 1992 Karl Lehenbauer and Mark Diekhans.
                      7: #
                      8: # Permission to use, copy, modify, and distribute this software and its
                      9: # documentation for any purpose and without fee is hereby granted, provided
                     10: # that the above copyright notice appear in all copies.  Karl Lehenbauer and
                     11: # Mark Diekhans make no representations about the suitability of this
                     12: # software for any purpose.  It is provided "as is" without express or
                     13: # implied warranty.
                     14: #------------------------------------------------------------------------------
                     15: # $Id: profrep.tcl,v 2.0 1992/10/16 04:52:05 markd Rel $
                     16: #------------------------------------------------------------------------------
                     17: #
                     18: 
                     19: #@package: TclX-profrep profrep
                     20: 
                     21: #
                     22: # Summarize the data from the profile command to the specified significant
                     23: # stack depth.  Returns the maximum number of characters of any significant
                     24: # stack.  (useful in columnizing reports).
                     25: #
                     26: proc profrep:summarize {profDataVar stackDepth sumProfDataVar} {
                     27:     upvar $profDataVar profData $sumProfDataVar sumProfData
                     28: 
                     29:     if {(![info exists profData]) || ([catch {array size profData}] != 0)} {
                     30:         error "`profDataVar' must be the name of an array returned by the `profile off' command"
                     31:     }
                     32:     set maxNameLen 0
                     33:     foreach procStack [array names profData] {
                     34:         if {[llength $procStack] < $stackDepth} {
                     35:             set sigProcStack $procStack
                     36:         } else {
                     37:             set sigProcStack [lrange $procStack 0 [expr {$stackDepth - 1}]]
                     38:         }
                     39:         set maxNameLen [max $maxNameLen [clength $sigProcStack]]
                     40:         if [info exists sumProfData($sigProcStack)] {
                     41:             set cur $sumProfData($sigProcStack)
                     42:             set add $profData($procStack)
                     43:             set     new [expr [lindex $cur 0]+[lindex $add 0]]
                     44:             lappend new [expr [lindex $cur 1]+[lindex $add 1]]
                     45:             lappend new [expr [lindex $cur 2]+[lindex $add 2]]
                     46:             set $sumProfData($sigProcStack) $new
                     47:         } else {
                     48:             set sumProfData($sigProcStack) $profData($procStack)
                     49:         }
                     50:     }
                     51:     return $maxNameLen
                     52: }
                     53: 
                     54: #
                     55: # Generate a list, sorted in descending order by the specified key, contain
                     56: # the indices into the summarized data.
                     57: #
                     58: proc profrep:sort {sumProfDataVar sortKey} {
                     59:     upvar $sumProfDataVar sumProfData
                     60: 
                     61:     case $sortKey {
                     62:         {calls} {set keyIndex 0}
                     63:         {real}  {set keyIndex 1}
                     64:         {cpu}   {set keyIndex 2}
                     65:         default {
                     66:             error "Expected a sort of: `calls',  `cpu' or ` real'"}
                     67:     }
                     68: 
                     69:     # Build a list to sort cosisting of a fix-length string containing the
                     70:     # key value and proc stack. Then sort it.
                     71: 
                     72:     foreach procStack [array names sumProfData] {
                     73:         set key [format "%016d" [lindex $sumProfData($procStack) $keyIndex]]
                     74:         lappend keyProcList [list $key $procStack]
                     75:     }
                     76:     set keyProcList [lsort $keyProcList]
                     77: 
                     78:     # Convert the assending sorted list into a descending list of proc stacks.
                     79: 
                     80:     for {set idx [expr [llength $keyProcList]-1]} {$idx >= 0} {incr idx -1} {
                     81:         lappend sortedProcList [lindex [lindex $keyProcList $idx] 1]
                     82:     }
                     83:     return $sortedProcList
                     84: }
                     85: 
                     86: #
                     87: # Print the sorted report
                     88: #
                     89: 
                     90: proc profrep:print {sumProfDataVar sortedProcList maxNameLen outFile
                     91:                     userTitle} {
                     92:     upvar $sumProfDataVar sumProfData
                     93:     
                     94:     if {$outFile == ""} {
                     95:         set outFH stdout
                     96:     } else {
                     97:         set outFH [open $outFile w]
                     98:     }
                     99: 
                    100:     # Output a header.
                    101: 
                    102:     set stackTitle "Procedure Call Stack"
                    103:     set maxNameLen [max $maxNameLen [clength $stackTitle]]
                    104:     set hdr [format "%-${maxNameLen}s %10s %10s %10s" $stackTitle \
                    105:                     "Calls" "Real Time" "CPU Time"]
                    106:     if {$userTitle != ""} {
                    107:         puts $outFH [replicate - [clength $hdr]]
                    108:         puts $outFH $userTitle
                    109:     }
                    110:     puts $outFH [replicate - [clength $hdr]]
                    111:     puts $outFH $hdr
                    112:     puts $outFH [replicate - [clength $hdr]]
                    113: 
                    114:     # Output the data in sorted order.
                    115: 
                    116:     foreach procStack $sortedProcList {
                    117:         set data $sumProfData($procStack)
                    118:         puts $outFH [format "%-${maxNameLen}s %10d %10d %10d" $procStack \
                    119:                             [lindex $data 0] [lindex $data 1] [lindex $data 2]]
                    120:     }
                    121:     if {$outFile != ""} {
                    122:         close $outFH
                    123:     }
                    124: }
                    125: 
                    126: #------------------------------------------------------------------------------
                    127: # Generate a report from data collect from the profile command.
                    128: #   o profDataVar (I) - The name of the array containing the data from profile.
                    129: #   o sortKey (I) - Value to sort by. One of "calls", "cpu" or "real".
                    130: #   o stackDepth (I) - The stack depth to consider significant.
                    131: #   o outFile (I) - Name of file to write the report to.  If omitted, stdout
                    132: #     is assumed.
                    133: #   o userTitle (I) - Title line to add to output.
                    134: 
                    135: proc profrep {profDataVar sortKey stackDepth {outFile {}} {userTitle {}}} {
                    136:     upvar $profDataVar profData
                    137: 
                    138:     set maxNameLen [profrep:summarize profData $stackDepth sumProfData]
                    139:     set sortedProcList [profrep:sort sumProfData $sortKey]
                    140:     profrep:print sumProfData $sortedProcList $maxNameLen $outFile $userTitle
                    141: 
                    142: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.