Merge pull request #1609 from davidhewitt/bench-gil

benches: add bench_gil
This commit is contained in:
David Hewitt 2021-05-17 08:27:14 +01:00 committed by GitHub
commit 51ba541a18
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 47 additions and 1 deletions

View File

@ -32,6 +32,7 @@ serde = {version = "1.0", optional = true}
[dev-dependencies]
assert_approx_eq = "1.1.0"
criterion = "0.3"
trybuild = "1.0.23"
rustversion = "1.0"
proptest = { version = "0.10.1", default-features = false, features = ["std"] }
@ -69,6 +70,10 @@ auto-initialize = []
# Optimizes PyObject to Vec conversion and so on.
nightly = []
[[bench]]
name = "bench_gil"
harness = false
[workspace]
members = [
"pyo3-macros",

41
benches/bench_gil.rs Normal file
View File

@ -0,0 +1,41 @@
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);