12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- #!/bin/tclsh
- #
- # SUMMARY:
- # Run this script in the same directory as the "vdbe_profile.out" file.
- # This script summarizes the results contained in that file.
- #
- # DETAILS:
- # Compile SQLite using the -DVDBE_PROFILE option on Linux. This causes
- # performance information about individual VDBE operations to be appended
- # to the "vdbe_profile.out" file. After content has been accumulated in
- # vdbe_profile.out, run this script to analyze the output and generate a
- # report.
- #
- if {![file readable vdbe_profile.out]} {
- error "run this script in the same directory as the vdbe_profile.out file"
- }
- set in [open vdbe_profile.out r]
- set stmt {}
- set allstmt {}
- while {![eof $in]} {
- set line [gets $in]
- if {$line==""} continue
- if {[regexp {^---- } $line]} {
- set stmt [lindex $line 1]
- if {[info exists cnt($stmt)]} {
- incr cnt($stmt)
- set firsttime 0
- } else {
- set cnt($stmt) 1
- set sql($stmt) {}
- set firsttime 1
- lappend allstmt $stmt
- }
- continue;
- }
- if {[regexp {^-- } $line]} {
- if {$firsttime} {
- append sql($stmt) [string range $line 3 end]\n
- }
- continue
- }
- if {![regexp {^ *\d+ *\d+ *\d+ *\d+ ([A-Z].*)} $line all detail]} continue
- set c [lindex $line 0]
- set t [lindex $line 1]
- set addr [lindex $line 3]
- set op [lindex $line 4]
- if {[info exists opcnt($op)]} {
- incr opcnt($op) $c
- incr opcycle($op) $t
- } else {
- set opcnt($op) $c
- set opcycle($op) $t
- }
- if {[info exists stat($stmt,$addr)]} {
- foreach {cx tx detail} $stat($stmt,$addr) break
- incr cx $c
- incr tx $t
- set stat($stmt,$addr) [list $cx $tx $detail]
- } else {
- set stat($stmt,$addr) [list $c $t $detail]
- }
- }
- close $in
- foreach stmt $allstmt {
- puts "********************************************************************"
- puts [string trim $sql($stmt)]
- puts "Execution count: $cnt($stmt)"
- set tcx 0
- set ttx 0
- for {set i 0} {[info exists stat($stmt,$i)]} {incr i} {
- foreach {cx tx detail} $stat($stmt,$i) break
- if {$cx==0} {
- set ax 0
- } else {
- set ax [expr {$tx/$cx}]
- }
- puts [format {%8d %12d %12d %4d %s} $cx $tx $ax $i $detail]
- incr tcx $cx
- incr ttx $tx
- }
- set tax [expr {$tcx>0?$ttx/$tcx:0}]
- puts [format {%8d %12d %12d TOTAL} $tcx $ttx $tax]
- }
- puts "********************************************************************"
- puts "OPCODES:"
- foreach op [lsort [array names opcnt]] {
- set cx $opcnt($op)
- set tx $opcycle($op)
- if {$cx==0} {
- set ax 0
- } else {
- set ax [expr {$tx/$cx}]
- }
- puts [format {%8d %12d %12d %s} $cx $tx $ax $op]
- }
|