Index: third_party/sqlite/src/tool/opcodesum.tcl |
diff --git a/third_party/sqlite/src/tool/opcodesum.tcl b/third_party/sqlite/src/tool/opcodesum.tcl |
new file mode 100644 |
index 0000000000000000000000000000000000000000..47dff32b9075001fc2dd378e6d82dc2f62f3483f |
--- /dev/null |
+++ b/third_party/sqlite/src/tool/opcodesum.tcl |
@@ -0,0 +1,34 @@ |
+#!/usr/bin/tclsh |
+# |
+# Run this script, redirecting input from cachegrind output, to compute the |
+# number of CPU cycles used by each VDBE opcode. |
+# |
+# The cachegrind output should be configured so that it reports a single |
+# column of Ir at the left margin. Ex: |
+# |
+# cg_annotation --show=Ir --auto=yes cachegrind.out.* | tclsh opcodesum.tcl |
+# |
+set currentop x |
+set ncycle(x) 0 |
+while {![eof stdin]} { |
+ set line [string map {\173 x \175 x \042 x} [gets stdin]] |
+ if {[regexp { \. case OP_.*:} $line]} { |
+ regexp {OP_(.+):} $line all currentop |
+ set ncycle($currentop) 0 |
+ } elseif {[lindex $line 1]=="default:" |
+ && [regexp {really OP_Noop and OP_Explain} $line]} { |
+ break |
+ } elseif {[lindex $line 0]!="."} { |
+ regsub -all {[^0-9]} [lindex $line 0] {} n |
+ if {$n!=""} {incr ncycle($currentop) $n} |
+ } |
+} |
+unset ncycle(x) |
+set results {} |
+foreach op [lsort [array names ncycle]] { |
+ if {$ncycle($op)==0} continue |
+ lappend results [list $ncycle($op) $op] |
+} |
+foreach entry [lsort -index 0 -int -decr $results] { |
+ puts [format {%-16s %10d} [lindex $entry 1] [lindex $entry 0]] |
+} |