aboutsummaryrefslogtreecommitdiffstats
path: root/bench/bench_compare.py
diff options
context:
space:
mode:
Diffstat (limited to 'bench/bench_compare.py')
-rw-r--r--bench/bench_compare.py140
1 files changed, 140 insertions, 0 deletions
diff --git a/bench/bench_compare.py b/bench/bench_compare.py
new file mode 100644
index 0000000..f6909b1
--- /dev/null
+++ b/bench/bench_compare.py
@@ -0,0 +1,140 @@
+'''
+Created on May 16, 2011
+
+@author: bungeman
+'''
+import sys
+import getopt
+import re
+
+def parse(lines):
+ """Takes iterable lines of bench output, returns {bench:{config:time}}."""
+
+ benches = {}
+ current_bench = None
+
+ for line in lines:
+ #see if this line starts a new bench
+ new_bench = re.search('running bench \[\d+ \d+\] (.{28})', line)
+ if new_bench:
+ current_bench = new_bench.group(1)
+
+ #add configs on this line to the current bench
+ if current_bench:
+ for new_config in re.finditer(' (.{4}): msecs = (\d+\.\d+)', line):
+ current_config = new_config.group(1)
+ current_time = float(new_config.group(2))
+ if current_bench in benches:
+ benches[current_bench][current_config] = current_time
+ else:
+ benches[current_bench] = {current_config : current_time}
+
+ return benches
+
+def usage():
+ """Prints simple usage information."""
+
+ print '-o <file> the old bench output file.'
+ print '-n <file> the new bench output file.'
+ print '-h causes headers to be output.'
+ print '-f <fieldSpec> which fields to output and in what order.'
+ print ' Not specifying is the same as -f "bcondp".'
+ print ' b: bench'
+ print ' c: config'
+ print ' o: old time'
+ print ' n: new time'
+ print ' d: diff'
+ print ' p: percent diff'
+
+
+def main():
+ """Parses command line and writes output."""
+
+ try:
+ opts, args = getopt.getopt(sys.argv[1:], "f:o:n:h")
+ except getopt.GetoptError, err:
+ print str(err)
+ usage()
+ sys.exit(2)
+
+ column_formats = {
+ 'b' : '{bench: >28} ',
+ 'c' : '{config: <4} ',
+ 'o' : '{old_time: >10.2f} ',
+ 'n' : '{new_time: >10.2f} ',
+ 'd' : '{diff: >+10.2f} ',
+ 'p' : '{diffp: >+7.1%} ',
+ }
+ header_formats = {
+ 'b' : '{bench: >28} ',
+ 'c' : '{config: <4} ',
+ 'o' : '{old_time: >10} ',
+ 'n' : '{new_time: >10} ',
+ 'd' : '{diff: >10} ',
+ 'p' : '{diffp: >7} ',
+ }
+
+ old = None
+ new = None
+ column_format = ""
+ header_format = ""
+ columns = 'bcondp'
+ header = False
+
+ for option, value in opts:
+ if option == "-o":
+ old = value
+ elif option == "-n":
+ new = value
+ elif option == "-h":
+ header = True
+ elif option == "-f":
+ columns = value
+ else:
+ usage()
+ assert False, "unhandled option"
+
+ if old is None or new is None:
+ usage()
+ sys.exit(2)
+
+ for column_char in columns:
+ if column_formats[column_char]:
+ column_format += column_formats[column_char]
+ header_format += header_formats[column_char]
+ else:
+ usage()
+ sys.exit(2)
+
+ if header:
+ print header_format.format(
+ bench='bench'
+ , config='conf'
+ , old_time='old'
+ , new_time='new'
+ , diff='diff'
+ , diffp='diffP'
+ )
+
+ old_benches = parse(open(old, 'r'))
+ new_benches = parse(open(new, 'r'))
+
+ for old_bench, old_configs in old_benches.items():
+ if old_bench in new_benches:
+ new_configs = new_benches[old_bench]
+ for old_config, old_time in old_configs.items():
+ if old_config in new_configs:
+ new_time = new_configs[old_config]
+ old_time = old_configs[old_config]
+ print column_format.format(
+ bench=old_bench.strip()
+ , config=old_config.strip()
+ , old_time=old_time
+ , new_time=new_time
+ , diff=(old_time - new_time)
+ , diffp=((old_time-new_time)/old_time)
+ )
+
+
+if __name__ == "__main__":
+ main()