|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.