88 lines
2.8 KiB
Python
88 lines
2.8 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
|
|
# Use of this source code is governed by a BSD-style license that can be
|
|
# found in the LICENSE file.
|
|
|
|
"""Define a type that wraps a Benchmark instance."""
|
|
|
|
from __future__ import division
|
|
from __future__ import print_function
|
|
|
|
import math
|
|
# FIXME(denik): Fix the import in chroot.
|
|
# pylint: disable=import-error
|
|
from scipy import stats
|
|
|
|
# See crbug.com/673558 for how these are estimated.
|
|
_estimated_stddev = {
|
|
'octane': 0.015,
|
|
'kraken': 0.019,
|
|
'speedometer': 0.007,
|
|
'speedometer2': 0.006,
|
|
'dromaeo.domcoreattr': 0.023,
|
|
'dromaeo.domcoremodify': 0.011,
|
|
'graphics_WebGLAquarium': 0.008,
|
|
'page_cycler_v2.typical_25': 0.021,
|
|
'loading.desktop': 0.021, # Copied from page_cycler initially
|
|
}
|
|
|
|
|
|
# Get #samples needed to guarantee a given confidence interval, assuming the
|
|
# samples follow normal distribution.
|
|
def _samples(b):
|
|
# TODO: Make this an option
|
|
# CI = (0.9, 0.02), i.e., 90% chance that |sample mean - true mean| < 2%.
|
|
p = 0.9
|
|
e = 0.02
|
|
if b not in _estimated_stddev:
|
|
return 1
|
|
d = _estimated_stddev[b]
|
|
# Get at least 2 samples so as to calculate standard deviation, which is
|
|
# needed in T-test for p-value.
|
|
n = int(math.ceil((stats.norm.isf((1 - p) / 2) * d / e)**2))
|
|
return n if n > 1 else 2
|
|
|
|
|
|
class Benchmark(object):
|
|
"""Class representing a benchmark to be run.
|
|
|
|
Contains details of the benchmark suite, arguments to pass to the suite,
|
|
iterations to run the benchmark suite and so on. Note that the benchmark name
|
|
can be different to the test suite name. For example, you may want to have
|
|
two different benchmarks which run the same test_name with different
|
|
arguments.
|
|
"""
|
|
|
|
def __init__(self,
|
|
name,
|
|
test_name,
|
|
test_args,
|
|
iterations,
|
|
rm_chroot_tmp,
|
|
perf_args,
|
|
suite='',
|
|
show_all_results=False,
|
|
retries=0,
|
|
run_local=False,
|
|
cwp_dso='',
|
|
weight=0):
|
|
self.name = name
|
|
# For telemetry, this is the benchmark name.
|
|
self.test_name = test_name
|
|
# For telemetry, this is the data.
|
|
self.test_args = test_args
|
|
self.iterations = iterations if iterations > 0 else _samples(name)
|
|
self.perf_args = perf_args
|
|
self.rm_chroot_tmp = rm_chroot_tmp
|
|
self.iteration_adjusted = False
|
|
self.suite = suite
|
|
self.show_all_results = show_all_results
|
|
self.retries = retries
|
|
if self.suite == 'telemetry':
|
|
self.show_all_results = True
|
|
if run_local and self.suite != 'telemetry_Crosperf':
|
|
raise RuntimeError('run_local is only supported by telemetry_Crosperf.')
|
|
self.run_local = run_local
|
|
self.cwp_dso = cwp_dso
|
|
self.weight = weight
|