blob: f293c2c3c1a14b6828b0b9bce8795d3005047f8d [file] [log] [blame]
#!/usr/bin/env python3
# Copyright (c) 2024, the R8 project authors. Please see the AUTHORS file
# for details. All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE file.
import historic_run
import json
import os
import perf
import time
import utils
import sys
APPS = perf.APPS
TARGETS = ['r8-full']
NUM_COMMITS = 1000
INDEX_HTML = os.path.join(utils.TOOLS_DIR, 'perf/index.html')
def DownloadCloudBucket(dest):
os.makedirs(dest)
utils.download_file_from_cloud_storage(perf.GetGSLocation('*'),
dest,
concurrent=True,
flags=['-R'])
def ParseJsonFromCloudStorage(filename, local_bucket):
abs_path = os.path.join(local_bucket, filename)
if not os.path.exists(abs_path):
return None
with open(abs_path, 'r') as f:
lines = f.readlines()
content = ''.join(lines)
try:
return json.loads(content)
except:
return None
def run():
# Get the N most recent commits sorted by newest first.
top = utils.get_sha1_from_revision('origin/main')
bottom = utils.get_nth_sha1_from_revision(NUM_COMMITS - 1, 'origin/main')
commits = historic_run.enumerate_git_commits(top, bottom)
assert len(commits) == NUM_COMMITS
# Download all benchmark data from the cloud bucket to a temp folder.
with utils.TempDir() as temp:
local_bucket = os.path.join(temp, perf.BUCKET)
DownloadCloudBucket(local_bucket)
# Aggregate all the result.json files into a single benchmark_data.json file
# that has the same format as tools/perf/benchmark_data.json.
benchmark_data = []
for commit in commits:
benchmarks = {}
for app in APPS:
for target in TARGETS:
filename = perf.GetArtifactLocation(app, target,
commit.hash(),
'result.json')
app_benchmark_data = ParseJsonFromCloudStorage(
filename, local_bucket)
if app_benchmark_data:
benchmarks[app] = app_benchmark_data
if benchmarks or benchmark_data:
benchmark_data.append({
'author': commit.author_name(),
'hash': commit.hash(),
'submitted': commit.committer_timestamp(),
'title': commit.title(),
'benchmarks': benchmarks
})
# Trim data.
new_benchmark_data_len = len(benchmark_data)
while new_benchmark_data_len > 0:
candidate_len = new_benchmark_data_len - 1
if not benchmark_data[candidate_len]['benchmarks']:
new_benchmark_data_len = candidate_len
else:
break
benchmark_data = benchmark_data[0:new_benchmark_data_len]
# Serialize JSON to temp file.
benchmark_data_file = os.path.join(temp, 'benchmark_data.json')
with open(benchmark_data_file, 'w') as f:
json.dump(benchmark_data, f)
# Write output files to public bucket.
perf.ArchiveOutputFile(benchmark_data_file,
'benchmark_data.json',
header='Cache-Control:no-store')
perf.ArchiveOutputFile(INDEX_HTML, 'index.html')
def main():
run()
if __name__ == '__main__':
sys.exit(main())