1*c8dee2aaSAndroid Build Coastguard Worker# Copyright 2016 Google Inc. 2*c8dee2aaSAndroid Build Coastguard Worker# 3*c8dee2aaSAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 4*c8dee2aaSAndroid Build Coastguard Worker# found in the LICENSE file. 5*c8dee2aaSAndroid Build Coastguard Worker 6*c8dee2aaSAndroid Build Coastguard Worker"""Parses an skpbench result from a line of output text.""" 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Workerfrom __future__ import print_function 9*c8dee2aaSAndroid Build Coastguard Workerimport re 10*c8dee2aaSAndroid Build Coastguard Workerimport sys 11*c8dee2aaSAndroid Build Coastguard Worker 12*c8dee2aaSAndroid Build Coastguard Workerclass BenchResult: 13*c8dee2aaSAndroid Build Coastguard Worker FLOAT_REGEX = '[-+]?(\d+(\.\d*)?|\.\d+)([eE][-+]?\d+)?' 14*c8dee2aaSAndroid Build Coastguard Worker PATTERN = re.compile('^(?P<accum_pad> *)' 15*c8dee2aaSAndroid Build Coastguard Worker '(?P<accum>' + FLOAT_REGEX + ')' 16*c8dee2aaSAndroid Build Coastguard Worker '(?P<median_pad> +)' 17*c8dee2aaSAndroid Build Coastguard Worker '(?P<median>' + FLOAT_REGEX + ')' 18*c8dee2aaSAndroid Build Coastguard Worker '(?P<max_pad> +)' 19*c8dee2aaSAndroid Build Coastguard Worker '(?P<max>' + FLOAT_REGEX + ')' 20*c8dee2aaSAndroid Build Coastguard Worker '(?P<min_pad> +)' 21*c8dee2aaSAndroid Build Coastguard Worker '(?P<min>' + FLOAT_REGEX + ')' 22*c8dee2aaSAndroid Build Coastguard Worker '(?P<stddev_pad> +)' 23*c8dee2aaSAndroid Build Coastguard Worker '(?P<stddev>' + FLOAT_REGEX + '%)' 24*c8dee2aaSAndroid Build Coastguard Worker '(?P<samples_pad> +)' 25*c8dee2aaSAndroid Build Coastguard Worker '(?P<samples>\d+)' 26*c8dee2aaSAndroid Build Coastguard Worker '(?P<sample_ms_pad> +)' 27*c8dee2aaSAndroid Build Coastguard Worker '(?P<sample_ms>\d+)' 28*c8dee2aaSAndroid Build Coastguard Worker '(?P<clock_pad> +)' 29*c8dee2aaSAndroid Build Coastguard Worker '(?P<clock>[cg]pu)' 30*c8dee2aaSAndroid Build Coastguard Worker '(?P<metric_pad> +)' 31*c8dee2aaSAndroid Build Coastguard Worker '(?P<metric>ms|fps)' 32*c8dee2aaSAndroid Build Coastguard Worker '(?P<config_pad> +)' 33*c8dee2aaSAndroid Build Coastguard Worker '(?P<config>[^\s]+)' 34*c8dee2aaSAndroid Build Coastguard Worker '(?P<bench_pad> +)' 35*c8dee2aaSAndroid Build Coastguard Worker '(?P<bench>[^\s]+)$') 36*c8dee2aaSAndroid Build Coastguard Worker 37*c8dee2aaSAndroid Build Coastguard Worker @classmethod 38*c8dee2aaSAndroid Build Coastguard Worker def match(cls, text): 39*c8dee2aaSAndroid Build Coastguard Worker match = cls.PATTERN.search(text) 40*c8dee2aaSAndroid Build Coastguard Worker return cls(match) if match else None 41*c8dee2aaSAndroid Build Coastguard Worker 42*c8dee2aaSAndroid Build Coastguard Worker def __init__(self, match): 43*c8dee2aaSAndroid Build Coastguard Worker self.accum = float(match.group('accum')) 44*c8dee2aaSAndroid Build Coastguard Worker self.median = float(match.group('median')) 45*c8dee2aaSAndroid Build Coastguard Worker self.max = float(match.group('max')) 46*c8dee2aaSAndroid Build Coastguard Worker self.min = float(match.group('min')) 47*c8dee2aaSAndroid Build Coastguard Worker self.stddev = float(match.group('stddev')[:-1]) # Drop '%' sign. 48*c8dee2aaSAndroid Build Coastguard Worker self.samples = int(match.group('samples')) 49*c8dee2aaSAndroid Build Coastguard Worker self.sample_ms = int(match.group('sample_ms')) 50*c8dee2aaSAndroid Build Coastguard Worker self.clock = match.group('clock') 51*c8dee2aaSAndroid Build Coastguard Worker self.metric = match.group('metric') 52*c8dee2aaSAndroid Build Coastguard Worker self.config = match.group('config') 53*c8dee2aaSAndroid Build Coastguard Worker self.bench = match.group('bench') 54*c8dee2aaSAndroid Build Coastguard Worker self._match = match 55*c8dee2aaSAndroid Build Coastguard Worker 56*c8dee2aaSAndroid Build Coastguard Worker def get_string(self, name): 57*c8dee2aaSAndroid Build Coastguard Worker return self._match.group(name) 58*c8dee2aaSAndroid Build Coastguard Worker 59*c8dee2aaSAndroid Build Coastguard Worker def format(self, config_suffix=None): 60*c8dee2aaSAndroid Build Coastguard Worker if not config_suffix or config_suffix == '': 61*c8dee2aaSAndroid Build Coastguard Worker return self._match.group(0) 62*c8dee2aaSAndroid Build Coastguard Worker else: 63*c8dee2aaSAndroid Build Coastguard Worker values = list() 64*c8dee2aaSAndroid Build Coastguard Worker for name in ['accum', 'median', 'max', 'min', 'stddev', 65*c8dee2aaSAndroid Build Coastguard Worker 'samples', 'sample_ms', 'clock', 'metric', 'config']: 66*c8dee2aaSAndroid Build Coastguard Worker values.append(self.get_string(name + '_pad')) 67*c8dee2aaSAndroid Build Coastguard Worker values.append(self.get_string(name)) 68*c8dee2aaSAndroid Build Coastguard Worker values.append(config_suffix) 69*c8dee2aaSAndroid Build Coastguard Worker bench_pad = self.get_string('bench_pad') 70*c8dee2aaSAndroid Build Coastguard Worker values.append(bench_pad[min(len(config_suffix), len(bench_pad) - 1):]) 71*c8dee2aaSAndroid Build Coastguard Worker values.append(self.get_string('bench')) 72*c8dee2aaSAndroid Build Coastguard Worker return ''.join(values) 73