[ty] Add multithreaded benchmark (#18822)

This commit is contained in:
Micha Reiser 2025-06-21 17:44:30 +02:00 committed by GitHub
parent ea812d0813
commit a6ad8fb342
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 25 additions and 20 deletions

View File

@ -204,8 +204,8 @@ static SYMPY: std::sync::LazyLock<Benchmark<'static>> = std::sync::LazyLock::new
) )
}); });
#[bench(args=[&*ALTAIR, &*FREQTRADE, &*PYDANTIC], sample_size=2, sample_count=3)] #[track_caller]
fn small(bencher: Bencher, benchmark: &Benchmark) { fn run_single_threaded(bencher: Bencher, benchmark: &Benchmark) {
bencher bencher
.with_inputs(|| benchmark.setup_iteration()) .with_inputs(|| benchmark.setup_iteration())
.bench_local_refs(|db| { .bench_local_refs(|db| {
@ -213,41 +213,46 @@ fn small(bencher: Bencher, benchmark: &Benchmark) {
}); });
} }
#[bench(args=[&*ALTAIR, &*FREQTRADE, &*PYDANTIC], sample_size=2, sample_count=3)]
fn small(bencher: Bencher, benchmark: &Benchmark) {
run_single_threaded(bencher, benchmark);
}
#[bench(args=[&*COLOUR_SCIENCE, &*PANDAS], sample_size=1, sample_count=3)] #[bench(args=[&*COLOUR_SCIENCE, &*PANDAS], sample_size=1, sample_count=3)]
fn medium(bencher: Bencher, benchmark: &Benchmark) { fn medium(bencher: Bencher, benchmark: &Benchmark) {
bencher run_single_threaded(bencher, benchmark);
.with_inputs(|| benchmark.setup_iteration())
.bench_local_refs(|db| {
check_project(db, benchmark.max_diagnostics);
});
} }
#[bench(args=[&*SYMPY], sample_size=1, sample_count=2)] #[bench(args=[&*SYMPY], sample_size=1, sample_count=2)]
fn large(bencher: Bencher, benchmark: &Benchmark) { fn large(bencher: Bencher, benchmark: &Benchmark) {
run_single_threaded(bencher, benchmark);
}
#[bench(args=[&*PYDANTIC], sample_size=3, sample_count=3)]
fn multithreaded(bencher: Bencher, benchmark: &Benchmark) {
let thread_pool = ThreadPoolBuilder::new().build().unwrap();
bencher bencher
.with_inputs(|| benchmark.setup_iteration()) .with_inputs(|| benchmark.setup_iteration())
.bench_local_refs(|db| { .bench_local_values(|db| {
check_project(db, benchmark.max_diagnostics); thread_pool.install(|| {
check_project(&db, benchmark.max_diagnostics);
db
})
}); });
} }
fn main() { fn main() {
let filter =
std::env::var("TY_LOG").unwrap_or("ty_walltime=info,ruff_benchmark=info".to_string());
let _logging = setup_logging_with_filter(&filter).expect("Filter to be valid");
// Disable multithreading for now due to
// https://github.com/salsa-rs/salsa/issues/918.
//
// Salsa has a fast-path for the first db when looking up ingredients.
// It seems that this fast-path becomes extremely slow for all db's other
// than the first one, especially when using multithreading (10x slower than the first run).
ThreadPoolBuilder::new() ThreadPoolBuilder::new()
.num_threads(1) .num_threads(1)
.use_current_thread() .use_current_thread()
.build_global() .build_global()
.unwrap(); .unwrap();
let filter =
std::env::var("TY_LOG").unwrap_or("ty_walltime=info,ruff_benchmark=info".to_string());
let _logging = setup_logging_with_filter(&filter).expect("Filter to be valid");
divan::main(); divan::main();
} }