benches: add bench_gil

This commit is contained in:
David Hewitt 2021-05-16 08:11:37 +01:00
parent c4b19c7e7c
commit 0cc77c77b2
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",
@ -83,4 +88,4 @@ members = [
[package.metadata.docs.rs]
no-default-features = true
features = ["macros", "num-bigint", "num-complex", "hashbrown", "serde", "multiple-pymethods"]
rustdoc-args = ["--cfg", "docsrs"]
rustdoc-args = ["--cfg", "docsrs"]

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);