vdbe_profile.tcl 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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. #
  14. if {![file readable vdbe_profile.out]} {
  15. error "run this script in the same directory as the vdbe_profile.out file"
  16. }
  17. set in [open vdbe_profile.out r]
  18. set stmt {}
  19. set allstmt {}
  20. while {![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. }
  63. close $in
  64. foreach stmt $allstmt {
  65. puts "********************************************************************"
  66. puts [string trim $sql($stmt)]
  67. puts "Execution count: $cnt($stmt)"
  68. set tcx 0
  69. set ttx 0
  70. for {set i 0} {[info exists stat($stmt,$i)]} {incr i} {
  71. foreach {cx tx detail} $stat($stmt,$i) break
  72. if {$cx==0} {
  73. set ax 0
  74. } else {
  75. set ax [expr {$tx/$cx}]
  76. }
  77. puts [format {%8d %12d %12d %4d %s} $cx $tx $ax $i $detail]
  78. incr tcx $cx
  79. incr ttx $tx
  80. }
  81. set tax [expr {$tcx>0?$ttx/$tcx:0}]
  82. puts [format {%8d %12d %12d TOTAL} $tcx $ttx $tax]
  83. }
  84. puts "********************************************************************"
  85. puts "OPCODES:"
  86. foreach op [lsort [array names opcnt]] {
  87. set cx $opcnt($op)
  88. set tx $opcycle($op)
  89. if {$cx==0} {
  90. set ax 0
  91. } else {
  92. set ax [expr {$tx/$cx}]
  93. }
  94. puts [format {%8d %12d %12d %s} $cx $tx $ax $op]
  95. }