91 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Tcl
		
	
	
	
	
	
			
		
		
	
	
			91 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Tcl
		
	
	
	
	
	
| #!/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)"
 | |
|   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]
 | |
|   }
 | |
| }
 | |
| 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]
 | |
| }
 | 
