blob: 5892aab0aa1a6fc0ed4515f6498f72235bdb14be [file] [log] [blame]
Mike Frysingerc7f15932013-03-20 13:43:35 -04001#!/usr/bin/python
bjanakiramana082e562013-02-15 09:09:57 +00002#
3# Copyright 2010 Google Inc. All Rights Reserved.
bjanakiramana082e562013-02-15 09:09:57 +00004"""Script to compare ChromeOS benchmarks
5
6Inputs:
7 <perflab-output directory 1 - baseline>
8 <perflab-output directory 2 - results>
9 --csv - comma separated results
10
11This script doesn't really know much about benchmarks. It simply looks for
12similarly names directories and a results.txt file, and compares
13the results and presents it, along with a geometric mean.
14
15"""
16
Luis Lozanof2a3ef42015-12-15 13:49:30 -080017__author__ = 'bjanakiraman@google.com (Bhaskar Janakiraman)'
bjanakiramana082e562013-02-15 09:09:57 +000018
kbaclawski20082a02013-02-16 02:12:57 +000019import glob
20import math
bjanakiramana082e562013-02-15 09:09:57 +000021import optparse
22import os
23import re
24import sys
kbaclawski20082a02013-02-16 02:12:57 +000025
bjanakiramana082e562013-02-15 09:09:57 +000026import image_chromeos
kbaclawski20082a02013-02-16 02:12:57 +000027import run_tests
bjanakiramana082e562013-02-15 09:09:57 +000028from utils import command_executer
bjanakiramana082e562013-02-15 09:09:57 +000029from utils import logger
30
Luis Lozanof2a3ef42015-12-15 13:49:30 -080031BENCHDIRS = '%s/default/default/*/gcc-4.4.3-glibc-2.11.1-grte-k8-opt/ref/*/results.txt'
bjanakiramana082e562013-02-15 09:09:57 +000032
33# Common initializations
34cmd_executer = command_executer.GetCommandExecuter()
35
36
37def Usage(parser, message):
Luis Lozanof2a3ef42015-12-15 13:49:30 -080038 print 'ERROR: ' + message
bjanakiramana082e562013-02-15 09:09:57 +000039 parser.print_help()
40 sys.exit(0)
41
42
43def GetStats(file):
44 """Return stats from file"""
45 f = open(file, 'r')
46 pairs = []
47 for l in f:
48 line = l.strip()
49 # Look for match lines like the following:
50 # METRIC isolated TotalTime_ms (down, scalar) trial_run_0: ['1524.4']
51 # METRIC isolated isolated_walltime (down, scalar) trial_run_0: ['167.407445192']
52 m = re.match(r"METRIC\s+isolated\s+(\S+).*\['(\d+(?:\.\d+)?)'\]", line)
53 if not m:
54 continue
55 metric = m.group(1)
Luis Lozanof2a3ef42015-12-15 13:49:30 -080056 if re.match(r'isolated_walltime', metric):
bjanakiramana082e562013-02-15 09:09:57 +000057 continue
58
59 value = float(m.group(2))
60 pairs.append((metric, value))
61
62 return dict(pairs)
63
Luis Lozanof2a3ef42015-12-15 13:49:30 -080064
bjanakiramana082e562013-02-15 09:09:57 +000065def PrintDash(n):
66 tmpstr = ''
67 for i in range(n):
68 tmpstr += '-'
69 print tmpstr
70
71
72def PrintHeaderCSV(hdr):
73 tmpstr = ''
74 for i in range(len(hdr)):
75 if tmpstr != '':
76 tmpstr += ','
77 tmpstr += hdr[i]
78 print tmpstr
79
80
81def PrintHeader(hdr):
82 tot_len = len(hdr)
83 PrintDash(tot_len * 15)
84
85 tmpstr = ''
86 for i in range(len(hdr)):
Luis Lozanof2a3ef42015-12-15 13:49:30 -080087 tmpstr += '%15.15s' % hdr[i]
bjanakiramana082e562013-02-15 09:09:57 +000088
89 print tmpstr
90 PrintDash(tot_len * 15)
91
Luis Lozanof2a3ef42015-12-15 13:49:30 -080092
bjanakiramana082e562013-02-15 09:09:57 +000093def Main(argv):
94 """Compare Benchmarks."""
95 # Common initializations
96
97 parser = optparse.OptionParser()
Luis Lozanof2a3ef42015-12-15 13:49:30 -080098 parser.add_option('-c',
99 '--csv',
100 dest='csv_output',
101 action='store_true',
102 default=False,
103 help='Output in csv form.')
bjanakiramana082e562013-02-15 09:09:57 +0000104
105 (options, args) = parser.parse_args(argv[1:])
106
107 # validate args
108 if len(args) != 2:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800109 Usage(parser, 'Needs <baseline output dir> <results output dir>')
bjanakiramana082e562013-02-15 09:09:57 +0000110
111 base_dir = args[0]
112 res_dir = args[1]
113
114 # find res benchmarks that have results
115 resbenches_glob = BENCHDIRS % res_dir
116 resbenches = glob.glob(resbenches_glob)
117
118 basebenches_glob = BENCHDIRS % base_dir
119 basebenches = glob.glob(basebenches_glob)
120
121 to_compare = []
122 for resbench in resbenches:
123 tmp = resbench.replace(res_dir, base_dir, 1)
124 if tmp in basebenches:
125 to_compare.append((resbench, tmp))
126
127 for (resfile, basefile) in to_compare:
128 stats = GetStats(resfile)
129 basestats = GetStats(basefile)
130 # Print a header
131 # benchname (remove results.txt), basetime, restime, %speed-up
132 hdr = []
133 benchname = re.split('/', resfile)[-2:-1][0]
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800134 benchname = benchname.replace('chromeos__', '', 1)
bjanakiramana082e562013-02-15 09:09:57 +0000135 hdr.append(benchname)
136 hdr.append('basetime')
137 hdr.append('restime')
138 hdr.append('%speed up')
139 if options.csv_output:
140 PrintHeaderCSV(hdr)
141 else:
142 PrintHeader(hdr)
143
144 # For geomean computations
145 prod = 1.0
146 count = 0
147 for key in stats.keys():
148 if key in basestats.keys():
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800149 # ignore very small values.
bjanakiramana082e562013-02-15 09:09:57 +0000150 if stats[key] < 0.01:
151 continue
152 count = count + 1
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800153 prod = prod * (stats[key] / basestats[key])
154 speedup = (basestats[key] - stats[key]) / basestats[key]
bjanakiramana082e562013-02-15 09:09:57 +0000155 speedup = speedup * 100.0
156 if options.csv_output:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800157 print '%s,%f,%f,%f' % (key, basestats[key], stats[key], speedup)
bjanakiramana082e562013-02-15 09:09:57 +0000158 else:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800159 print '%15.15s%15.2f%15.2f%14.2f%%' % (key, basestats[key],
160 stats[key], speedup)
bjanakiramana082e562013-02-15 09:09:57 +0000161
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800162 prod = math.exp(1.0 / count * math.log(prod))
bjanakiramana082e562013-02-15 09:09:57 +0000163 prod = (1.0 - prod) * 100
164 if options.csv_output:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800165 print '%s,,,%f' % ('Geomean', prod)
bjanakiramana082e562013-02-15 09:09:57 +0000166 else:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800167 print '%15.15s%15.15s%15.15s%14.2f%%' % ('Geomean', '', '', prod)
bjanakiramana082e562013-02-15 09:09:57 +0000168 print
asharif2198c512013-02-15 09:21:35 +0000169 return 0
bjanakiramana082e562013-02-15 09:09:57 +0000170
171
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800172if __name__ == '__main__':
asharif2198c512013-02-15 09:21:35 +0000173 retval = Main(sys.argv)
174 sys.exit(retval)