42 lines
1.2 KiB
Rust
42 lines
1.2 KiB
Rust
|
use criterion::{criterion_group, criterion_main, BatchSize, Bencher, Criterion};
|
||
|
|
||
|
use pyo3::{prelude::*, GILPool};
|
||
|
|
||
|
fn bench_clean_gilpool_new(b: &mut Bencher) {
|
||
|
Python::with_gil(|_py| {
|
||
|
b.iter(|| {
|
||
|
let _ = unsafe { GILPool::new() };
|
||
|
});
|
||
|
});
|
||
|
}
|
||
|
|
||
|
fn bench_clean_acquire_gil(b: &mut Bencher) {
|
||
|
// Acquiring first GIL will also create a "clean" GILPool, so this measures the Python overhead.
|
||
|
b.iter(|| {
|
||
|
let _ = Python::acquire_gil();
|
||
|
});
|
||
|
}
|
||
|
|
||
|
fn bench_dirty_acquire_gil(b: &mut Bencher) {
|
||
|
let obj = Python::with_gil(|py| py.None());
|
||
|
b.iter_batched(
|
||
|
|| {
|
||
|
// Clone and drop an object so that the GILPool has work to do.
|
||
|
let _ = obj.clone();
|
||
|
},
|
||
|
|_| {
|
||
|
let _ = Python::acquire_gil();
|
||
|
},
|
||
|
BatchSize::NumBatches(1),
|
||
|
);
|
||
|
}
|
||
|
|
||
|
fn criterion_benchmark(c: &mut Criterion) {
|
||
|
c.bench_function("clean_gilpool_new", bench_clean_gilpool_new);
|
||
|
c.bench_function("clean_acquire_gil", bench_clean_acquire_gil);
|
||
|
c.bench_function("dirty_acquire_gil", bench_dirty_acquire_gil);
|
||
|
}
|
||
|
|
||
|
criterion_group!(benches, criterion_benchmark);
|
||
|
criterion_main!(benches);
|