| #!/usr/bin/env python3 |
| # Copyright 2021 The IREE Authors |
| # |
| # Licensed under the Apache License v2.0 with LLVM Exceptions. |
| # See https://llvm.org/LICENSE.txt for license information. |
| # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| """Diffs two local benchmark result JSON files. |
| |
| Example usage: |
| python3 diff_local_benchmarks.py --base=/path/to/base_benchmarks.json |
| --target=/path/to/target_benchmarks.json |
| """ |
| |
| import pathlib |
| import sys |
| |
| # Add build_tools python dir to the search path. |
| sys.path.insert(0, str(pathlib.Path(__file__).parent.with_name("python"))) |
| |
| import argparse |
| |
| from typing import Optional |
| |
| from common.benchmark_presentation import * |
| |
| |
| def get_benchmark_result_markdown( |
| base_benchmark_file: Optional[pathlib.Path], |
| target_benchmark_file: Optional[pathlib.Path], |
| base_compile_stats_file: Optional[pathlib.Path], |
| target_compile_stats_file: Optional[pathlib.Path], |
| verbose: bool = False) -> str: |
| """Gets the full markdown summary of all benchmarks in files.""" |
| base_benchmarks = {} |
| target_benchmarks = {} |
| base_compilation_metrics = {} |
| target_compilation_metrics = {} |
| if base_benchmark_file and target_benchmark_file: |
| base_benchmarks = aggregate_all_benchmarks([base_benchmark_file]) |
| target_benchmarks = aggregate_all_benchmarks([target_benchmark_file]) |
| if base_compile_stats_file and target_compile_stats_file: |
| base_compilation_metrics = collect_all_compilation_metrics( |
| [base_compile_stats_file]) |
| target_compilation_metrics = collect_all_compilation_metrics( |
| [target_compile_stats_file]) |
| |
| # Update the target benchmarks with their corresponding base numbers. |
| for bench in base_benchmarks: |
| if bench in target_benchmarks: |
| target_benchmarks[bench].base_mean_time = base_benchmarks[bench].mean_time |
| |
| for target_name, base_metrics in base_compilation_metrics.items(): |
| updated_metrics = base_metrics |
| for mapper in COMPILATION_METRICS_TO_TABLE_MAPPERS: |
| metric_key = mapper.get_series_name(target_name) |
| base_value, _ = mapper.get_current_and_base_value(base_metrics) |
| updated_metrics = mapper.update_base_value(updated_metrics, base_value) |
| target_compilation_metrics[target_name] = updated_metrics |
| |
| # Compose the full benchmark tables. |
| full_table = [md.header("Full Benchmark Summary", 2)] |
| full_table.append(categorize_benchmarks_into_tables(target_benchmarks)) |
| |
| # Compose the full compilation metrics tables. |
| full_table.append( |
| categorize_compilation_metrics_into_tables(target_compilation_metrics)) |
| |
| return "\n\n".join(full_table) |
| |
| |
| def parse_arguments(): |
| """Parses command-line options.""" |
| |
| def check_file_path(path): |
| path = pathlib.Path(path) |
| if path.is_file(): |
| return path |
| else: |
| raise ValueError(path) |
| |
| parser = argparse.ArgumentParser() |
| parser.add_argument("--base", |
| type=check_file_path, |
| help="Base benchmark results") |
| parser.add_argument("--target", |
| type=check_file_path, |
| help="Target benchmark results") |
| parser.add_argument("--base-compile-stats", |
| type=check_file_path, |
| help="Base compilation statistics") |
| parser.add_argument("--target-compile-stats", |
| type=check_file_path, |
| help="Target compilation statistics") |
| parser.add_argument("--verbose", |
| action="store_true", |
| help="Print internal information during execution") |
| args = parser.parse_args() |
| |
| return args |
| |
| |
| if __name__ == "__main__": |
| args = parse_arguments() |
| if args.base or args.target: |
| if not args.base or not args.target: |
| raise ValueError("--base and --target must be used together.") |
| if args.base_compile_stats or args.target_compile_stats: |
| if not args.base_compile_stats or not args.target_compile_stats: |
| raise ValueError("--base-compile-stats and --target-compile-stats must " |
| "be used together.") |
| |
| print( |
| get_benchmark_result_markdown(args.base, |
| args.target, |
| args.base_compile_stats, |
| args.target_compile_stats, |
| verbose=args.verbose)) |