ftl/benchmark/benchmark.py (65 lines of code) (raw):
# Copyright 2017 Google Inc. All rights reserved.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# http://www.apache.org/licenses/LICENSE-2.0
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import subprocess
import datetime
import time
import os
import logging
from google.cloud import bigquery
class Benchmark():
def __init__(self, args, runtime):
self._base = args.base
self._name = args.name
self._directory = args.directory
self._iterations = args.iterations
self._description = args.description
self._project = args.project
self._dataset = args.dataset
self._table = args.table
self._runtime = runtime
self._gen_files = args.gen_files
def _record_build_times_to_bigquery(self, build_times):
current_date = datetime.datetime.now()
logging.info('Retrieving bigquery client')
client = bigquery.Client(project=self._project)
dataset_ref = client.dataset(self._dataset)
table_ref = dataset_ref.table(self._table)
table = client.get_table(table_ref)
full_name = "{0}:{1}.{2}".format(self._project, self._dataset,
self._table)
logging.info("Adding build time data to {0}".format(full_name))
rows = [(current_date, self._description, bt[0], bt[1])
for bt in build_times]
client.create_rows(table, rows)
logging.info("Finished adding build times to {0}".format(full_name))
def run_benchmarks(self):
logging.getLogger().setLevel("NOTSET")
logging.basicConfig(
format='%(asctime)s.%(msecs)03d %(levelname)-8s %(message)s',
datefmt='%Y-%m-%d,%H:%M:%S')
build_times = []
for i in range(self._gen_files):
file_name = os.path.join(self._directory, 'app_file_%d' % i)
with open(file_name, 'wb') as fout:
fout.write(os.urandom(1024))
logging.info('Beginning building {0} images'.format(self._runtime))
for _ in range(self._iterations):
try:
start_time = time.time()
# For the binary
builder_path = 'ftl/{0}_builder.par'.format(self._runtime)
# For container builder
if not os.path.isfile(builder_path):
builder_path = 'bazel-bin/ftl/{0}_builder.par'.format(
self._runtime)
cmd = subprocess.Popen(
[
builder_path, '--base', self._base, '--name',
self._name, '--directory', self._directory,
'--no-cache'
],
stderr=subprocess.PIPE)
_, output = cmd.communicate()
build_time = round(time.time() - start_time, 2)
build_times.append((build_time, output))
except OSError:
raise OSError(
"""Benchmarking assumes either ftl/{0}_builder.par
or bazel-bin/ftl/{0}_builder.par
exists""".format(self._runtime))
logging.info('Beginning recording build times to bigquery')
self._record_build_times_to_bigquery(build_times)