mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-11-15 23:08:11 +00:00
Adds `toolchain/benchmarking/prelude_benchmark.cpp`, which measures the time to compile the Core prelude and reports the most interesting SemIR memory statistics as benchmark counters. The prelude is compiled by checking a file that imports it: the implicit prelude import causes the check phase to lex, parse, and check the full set of prelude files, so this is a direct measure of prelude compilation cost. Four input variations exercise increasing amounts of the prelude: an empty file, a minimal single-type use, an operator-heavy file that hits many impls, and a compact file that pulls in a wide swath of the prelude. Memory usage is queried directly: `Driver::set_mem_usage` takes a `MemUsage` that a compile merges each file's usage into; the benchmark passes one, compiles, and sums the entries by label. A compilation unit collects into its own `MemUsage` whenever usage is dumped or a sink is provided (decided in `SetMultiUnitCache`); after a file is done it dumps that `MemUsage` per-file as before and, if a sink was provided, merges into it via a new `MemUsage::Add(const MemUsage&)` overload. `MemUsage` also exposes its entries via a public `Entry` type and an `entries()` accessor. Also extends `scripts/bench_runner.py` to (1) treat Mem-prefixed counters as cost metrics (smaller is better) and (2) tolerate metrics that aren't reported by every benchmark in a binary. Assisted-by: Claude Code --------- Co-authored-by: Christopher Di Bella <cjdb.ns@gmail.com>
119 lines
3.3 KiB
Python
119 lines
3.3 KiB
Python
# Part of the Carbon Language project, under the Apache License v2.0 with LLVM
|
|
# Exceptions. See /LICENSE for license information.
|
|
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
#
|
|
# Benchmarking infrastructure as well as comprehensive benchmarks across the
|
|
# tolochain. Infrastructure libraries may be depended on by focused benchmarks
|
|
# in various other parts of the toolchain.
|
|
|
|
load("@rules_shell//shell:sh_test.bzl", "sh_test")
|
|
load("//bazel/cc_rules:defs.bzl", "cc_binary", "cc_library", "cc_test")
|
|
load("//bazel/cc_toolchains:defs.bzl", "cc_env")
|
|
|
|
package(default_visibility = ["//visibility:public"])
|
|
|
|
cc_library(
|
|
name = "source_gen_lib",
|
|
testonly = 1,
|
|
srcs = ["source_gen.cpp"],
|
|
hdrs = ["source_gen.h"],
|
|
deps = [
|
|
"//common:check",
|
|
"//common:map",
|
|
"//common:raw_string_ostream",
|
|
"//common:set",
|
|
"//toolchain/lex:token_kind",
|
|
"@abseil-cpp//absl/random",
|
|
"@llvm-project//llvm:Support",
|
|
],
|
|
)
|
|
|
|
cc_test(
|
|
name = "source_gen_test",
|
|
size = "small",
|
|
srcs = ["source_gen_test.cpp"],
|
|
deps = [
|
|
":source_gen_lib",
|
|
"//common:all_llvm_targets",
|
|
"//common:set",
|
|
"//testing/base:global_exe_path",
|
|
"//testing/base:gtest_main",
|
|
"//toolchain/base:install_paths_test_helpers",
|
|
"//toolchain/driver",
|
|
"@googletest//:gtest",
|
|
"@llvm-project//llvm:Support",
|
|
],
|
|
)
|
|
|
|
cc_binary(
|
|
name = "source_gen",
|
|
testonly = 1,
|
|
srcs = ["source_gen_main.cpp"],
|
|
deps = [
|
|
":source_gen_lib",
|
|
"//common:bazel_working_dir",
|
|
"//common:command_line",
|
|
"//common:init_llvm",
|
|
"//common:ostream",
|
|
"@llvm-project//llvm:Support",
|
|
],
|
|
)
|
|
|
|
cc_binary(
|
|
name = "compile_benchmark",
|
|
testonly = 1,
|
|
srcs = ["compile_benchmark.cpp"],
|
|
deps = [
|
|
":source_gen_lib",
|
|
"//common:all_llvm_targets",
|
|
"//testing/base:benchmark_main",
|
|
"//testing/base:global_exe_path",
|
|
"//toolchain/base:install_paths_test_helpers",
|
|
"//toolchain/driver",
|
|
"//toolchain/driver:clang_runner",
|
|
"//toolchain/testing:compile_helper",
|
|
"@google_benchmark//:benchmark",
|
|
"@llvm-project//llvm:Support",
|
|
],
|
|
)
|
|
|
|
sh_test(
|
|
name = "compile_benchmark_test",
|
|
size = "small",
|
|
srcs = [":compile_benchmark"],
|
|
args = [
|
|
"--benchmark_dry_run",
|
|
# The `$$` is repeated for Bazel escaping of `$`.
|
|
"--benchmark_filter=/256$$",
|
|
],
|
|
env = cc_env(),
|
|
)
|
|
|
|
cc_binary(
|
|
name = "prelude_benchmark",
|
|
testonly = 1,
|
|
srcs = ["prelude_benchmark.cpp"],
|
|
deps = [
|
|
"//common:all_llvm_targets",
|
|
"//common:check",
|
|
"//testing/base:benchmark_main",
|
|
"//testing/base:global_exe_path",
|
|
"//toolchain/base:install_paths",
|
|
"//toolchain/base:install_paths_test_helpers",
|
|
"//toolchain/base:mem_usage",
|
|
"//toolchain/driver",
|
|
"@google_benchmark//:benchmark",
|
|
"@llvm-project//llvm:Support",
|
|
],
|
|
)
|
|
|
|
sh_test(
|
|
name = "prelude_benchmark_test",
|
|
size = "small",
|
|
srcs = [":prelude_benchmark"],
|
|
# No `--benchmark_filter` is needed (unlike `compile_benchmark_test`): the
|
|
# benchmarks aren't `Range()`-parameterized, so a dry run is already cheap.
|
|
args = ["--benchmark_dry_run"],
|
|
env = cc_env(),
|
|
)
|