#!/usr/bin/env python
# Copyright 2020 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Script which process RendererPerfTest output.
Run viz_perftests.exe --gtest_filter=RendererPerfTest* > stdout.txt.
Then run this script as
python process_renderer_perftest_results.py --test-stdout="stdout.txt"
The perf data will be collected and stored in "output.csv".
"""
import argparse
import csv
import logging
import sys
def SaveResultsAsCSV(csv_data, csv_filename):
assert len(csv_data) > 0
with open(csv_filename, 'wb') as csv_file:
labels = sorted(csv_data[0].keys(), reverse=True)
writer = csv.DictWriter(csv_file, fieldnames=labels)
writer.writeheader()
writer.writerows(csv_data)
def FindTestEntry(csv_data, test_name):
for entry in csv_data:
if entry['TestName'] == test_name:
return entry
return None
def ProcessOutput(lines):
csv_data = []
for line in lines:
line = line.strip()
if line.startswith('[ RUN ]'):
test_name = line.split('.')[1]
entry = FindTestEntry(csv_data, test_name)
if entry is None:
entry = {'TestName': test_name}
csv_data.append(entry)
elif line.startswith('Using '):
renderer = line.split()[1][:-8]
elif line.startswith('*RESULT '):
fps = line.split('=')[1].strip().split()[0]
assert renderer == 'GL' or renderer == 'Skia'
assert entry is not None
entry['FPS_' + renderer] = fps
elif line.startswith('Histogram: '):
draw_to_swap_us_mean = line.split('=')[1].strip()
assert renderer == 'GL' or renderer == 'Skia'
assert entry is not None
entry['DrawToSwap_' + renderer] = draw_to_swap_us_mean
elif line.startswith('[ OK ]'):
end_test_name = line.split('.')[1].split()[0]
assert test_name == end_test_name
test_name = None
entry = None
renderer = None
return csv_data
def main():
rest_args = sys.argv[1:]
parser = argparse.ArgumentParser(
description='Gather RendererPerfTest results.',
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument(
'--test-stdout',
metavar='FILE',
help='Test stdout filename. Input of this script.')
parser.add_argument(
'--csv-file',
metavar='FILE',
default='output.csv',
help='CSV filename. Output of this script. '
'Default is output.csv.')
options = parser.parse_args(rest_args)
input_filename = options.test_stdout
if input_filename is None:
logging.error('Specify test stdout filename with --test-stdout.')
return 0
with open(input_filename, 'r') as input_file:
lines = input_file.readlines()
csv_data = ProcessOutput(lines)
SaveResultsAsCSV(csv_data, options.csv_file)
return 0
if __name__ == '__main__':
sys.exit(main())