1#!/bin/tclsh 2# 3# SUMMARY: 4# Run this script in the same directory as the "vdbe_profile.out" file. 5# This script summarizes the results contained in that file. 6# 7# DETAILS: 8# Compile SQLite using the -DVDBE_PROFILE option on Linux. This causes 9# performance information about individual VDBE operations to be appended 10# to the "vdbe_profile.out" file. After content has been accumulated in 11# vdbe_profile.out, run this script to analyze the output and generate a 12# report. 13# 14if {![file readable vdbe_profile.out]} { 15 error "run this script in the same directory as the vdbe_profile.out file" 16} 17set in [open vdbe_profile.out r] 18set stmt {} 19set allstmt {} 20while {![eof $in]} { 21 set line [gets $in] 22 if {$line==""} continue 23 if {[regexp {^---- } $line]} { 24 set stmt [lindex $line 1] 25 if {[info exists cnt($stmt)]} { 26 incr cnt($stmt) 27 set firsttime 0 28 } else { 29 set cnt($stmt) 1 30 set sql($stmt) {} 31 set firsttime 1 32 lappend allstmt $stmt 33 } 34 continue; 35 } 36 if {[regexp {^-- } $line]} { 37 if {$firsttime} { 38 append sql($stmt) [string range $line 3 end]\n 39 } 40 continue 41 } 42 if {![regexp {^ *\d+ *\d+ *\d+ *\d+ ([A-Z].*)} $line all detail]} continue 43 set c [lindex $line 0] 44 set t [lindex $line 1] 45 set addr [lindex $line 3] 46 set op [lindex $line 4] 47 if {[info exists opcnt($op)]} { 48 incr opcnt($op) $c 49 incr opcycle($op) $t 50 } else { 51 set opcnt($op) $c 52 set opcycle($op) $t 53 } 54 if {[info exists stat($stmt,$addr)]} { 55 foreach {cx tx detail} $stat($stmt,$addr) break 56 incr cx $c 57 incr tx $t 58 set stat($stmt,$addr) [list $cx $tx $detail] 59 } else { 60 set stat($stmt,$addr) [list $c $t $detail] 61 } 62} 63close $in 64 65foreach stmt $allstmt { 66 puts "********************************************************************" 67 puts [string trim $sql($stmt)] 68 puts "Execution count: $cnt($stmt)" 69 for {set i 0} {[info exists stat($stmt,$i)]} {incr i} { 70 foreach {cx tx detail} $stat($stmt,$i) break 71 if {$cx==0} { 72 set ax 0 73 } else { 74 set ax [expr {$tx/$cx}] 75 } 76 puts [format {%8d %12d %12d %4d %s} $cx $tx $ax $i $detail] 77 } 78} 79puts "********************************************************************" 80puts "OPCODES:" 81foreach op [lsort [array names opcnt]] { 82 set cx $opcnt($op) 83 set tx $opcycle($op) 84 if {$cx==0} { 85 set ax 0 86 } else { 87 set ax [expr {$tx/$cx}] 88 } 89 puts [format {%8d %12d %12d %s} $cx $tx $ax $op] 90} 91