blob: 56df62075f70acbd6e4772c9e0b01a3d69c48ccd [file] [log] [blame]
#!/usr/bin/python2.4
# Copyright 2008 The Native Client Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Program to parse hammer output and sort tests by how long they took to run.
The output should be from the CommandTest in SConstruct.
"""
from __future__ import print_function
import getopt
import re
import sys
class Analyzer(object):
"""Basic run time analysis (sorting, so far)."""
def __init__(self):
self._data = [] # list of (time, test-name) tuples
def AddData(self, execution_time, test_name, mode):
self._data.append((execution_time, test_name, mode))
def Sort(self):
self._data.sort(None, lambda x: x[0], True)
def Top(self, n):
return self._data[:n]
def TrimTestName(name):
s = '/scons-out/'
ix = name.find(s)
if ix < 0:
return name[ix + len(s):]
return name
def Usage():
print('Usage: test_timing [-n top-n-to-print]', file=sys.stderr)
def main(argv):
top_n = 10
try:
optlist, argv = getopt.getopt(argv[1:], 'n:')
except getopt.error, e:
print(str(e), file=sys.stderr)
Usage()
return 1
for opt, val in optlist:
if opt == '-n':
try:
top_n = int(val)
except ValueError:
print('test_timing: -n arg should be an integer', file=sys.stderr)
Usage()
return 1
mode = 'Unknown'
mode_nfa = re.compile(r'^running.*scons-out/((opt|dbg)-linux)')
nfa = re.compile(r'^Test (.*) took ([.0-9]*) secs')
analyzer = Analyzer()
for line in sys.stdin:
mobj = mode_nfa.match(line)
if mobj is not None:
mode = mobj.group(1)
continue
mobj = nfa.match(line)
if mobj is not None:
analyzer.AddData(float(mobj.group(2)), mobj.group(1), mode)
analyzer.Sort()
print('%-12s %-9s %s' % ('Time', 'Mode', 'Test Name'))
print('%-12s %-9s %s' % (12 * '-', 9 * '-', '---------'))
for time, name, mode in analyzer.Top(top_n):
print('%12.8f %-9s %s' % (time, mode, TrimTestName(name)))
return 0
if __name__ == '__main__':
sys.exit(main(sys.argv))