| # Copyright 2015 The Chromium Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| import imp |
| import inspect |
| import os |
| import sys |
| |
| from core import path_util |
| from core import perf_benchmark |
| |
| from telemetry import benchmark as benchmark_module |
| |
| from py_utils import discover |
| |
| def GetClassFilePath(clazz): |
| """ Return the absolute file path to |clazz|. """ |
| assert inspect.isclass(clazz) |
| path = os.path.abspath(inspect.getfile(clazz)) |
| if path.endswith('.pyc'): |
| return path[:-1] |
| return path |
| |
| |
| def GetBenchmarkNamesForFile(top_level_dir, benchmark_file_dir): |
| """ Return the list of all benchmark names of benchmarks defined in |
| |benchmark_file_dir|. |
| """ |
| original_sys_path = sys.path[:] |
| top_level_dir = os.path.abspath(top_level_dir) |
| original_sys_path = sys.path[:] |
| if top_level_dir not in sys.path: |
| sys.path.append(top_level_dir) |
| try: |
| module = imp.load_source('_tmp_module_name_', benchmark_file_dir) |
| benchmark_names = [] |
| for _, obj in inspect.getmembers(module): |
| if (inspect.isclass(obj) and issubclass(obj, perf_benchmark.PerfBenchmark) |
| and GetClassFilePath(obj) == benchmark_file_dir): |
| benchmark_names.append(obj.Name()) |
| return sorted(benchmark_names) |
| finally: |
| sys.path = original_sys_path |
| |
| |
| def GetOfficialBenchmarks(): |
| """Returns the list of all benchmarks to be run on perf waterfall. |
| The benchmarks are sorted by order of their names. |
| """ |
| benchmarks = list( |
| discover.DiscoverClasses(start_dir=path_util.GetOfficialBenchmarksDir(), |
| top_level_dir=path_util.GetPerfDir(), |
| base_class=benchmark_module.Benchmark, |
| index_by_class_name=True).values()) |
| benchmarks.sort(key=lambda b: b.Name()) |
| return benchmarks |
| |
| |
| def GetContribBenchmarks(): |
| """Returns the list of all contrib benchmarks. |
| The benchmarks are sorted by order of their names. |
| """ |
| _BENCHMARKS_TO_SKIP = { |
| # This benchmark is intended to be a convenience base class for writing |
| # other benchmarks, and not a standalone benchmark. |
| 'perf_benchmark_with_profiling.PerfBenchmarkWithProfiling', |
| 'perf_benchmark_with_profiling_unittest.PerfBenchmarkForTesting', |
| # This benchmark is a base class for power measurements. |
| 'power_perf_benchmark_base.PowerPerfBenchmarkBase', |
| } |
| |
| benchmarks = list( |
| discover.DiscoverClasses(start_dir=path_util.GetContribDir(), |
| top_level_dir=path_util.GetPerfDir(), |
| base_class=benchmark_module.Benchmark, |
| index_by_class_name=True).values()) |
| benchmarks = [ |
| benchmark for benchmark in benchmarks |
| if benchmark.Name() not in _BENCHMARKS_TO_SKIP |
| ] |
| benchmarks.sort(key=lambda b: b.Name()) |
| return benchmarks |
| |
| |
| def GetAllBenchmarks(): |
| """Returns all benchmarks in tools/perf directory. |
| The benchmarks are sorted by order of their names. |
| """ |
| waterfall_benchmarks = GetOfficialBenchmarks() |
| contrib_benchmarks = GetContribBenchmarks() |
| benchmarks = waterfall_benchmarks + contrib_benchmarks |
| benchmarks.sort(key=lambda b: b.Name()) |
| return benchmarks |
| |
| |
| def GetBenchmarksInSubDirectory(directory): |
| return list( |
| discover.DiscoverClasses(start_dir=directory, |
| top_level_dir=path_util.GetPerfDir(), |
| base_class=benchmark_module.Benchmark, |
| index_by_class_name=True).values()) |