Skip to content

Commit eb8e2c0

Browse files
committed
Avoid taking the GIL for each benchmark iteration, but also do not leak like a siv.
1 parent 065c357 commit eb8e2c0

File tree

1 file changed

+18
-16
lines changed

1 file changed

+18
-16
lines changed

benches/array.rs

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,10 @@ impl Iterator for Iter {
1919
}
2020

2121
fn from_iter(bencher: &mut Bencher, size: usize) {
22-
bencher.iter(|| {
22+
iter_with_gil(bencher, |py| {
2323
let iter = black_box(Iter(0..size));
2424

25-
Python::with_gil(|py| {
26-
PyArray1::from_iter(py, iter);
27-
});
25+
PyArray1::from_iter(py, iter);
2826
});
2927
}
3028

@@ -64,12 +62,10 @@ impl ExactSizeIterator for ExactIter {
6462
}
6563

6664
fn from_exact_iter(bencher: &mut Bencher, size: usize) {
67-
bencher.iter(|| {
65+
iter_with_gil(bencher, |py| {
6866
let iter = black_box(ExactIter(0..size));
6967

70-
Python::with_gil(|py| {
71-
PyArray1::from_exact_iter(py, iter);
72-
});
68+
PyArray1::from_exact_iter(py, iter);
7369
});
7470
}
7571

@@ -91,12 +87,10 @@ fn from_exact_iter_large(bencher: &mut Bencher) {
9187
fn from_slice(bencher: &mut Bencher, size: usize) {
9288
let vec = (0..size).collect::<Vec<_>>();
9389

94-
bencher.iter(|| {
90+
iter_with_gil(bencher, |py| {
9591
let slice = black_box(&vec);
9692

97-
Python::with_gil(|py| {
98-
PyArray1::from_slice(py, slice);
99-
});
93+
PyArray1::from_slice(py, slice);
10094
});
10195
}
10296

@@ -118,12 +112,10 @@ fn from_slice_large(bencher: &mut Bencher) {
118112
fn from_object_slice(bencher: &mut Bencher, size: usize) {
119113
let vec = Python::with_gil(|py| (0..size).map(|val| val.to_object(py)).collect::<Vec<_>>());
120114

121-
bencher.iter(|| {
115+
iter_with_gil(bencher, |py| {
122116
let slice = black_box(&vec);
123117

124-
Python::with_gil(|py| {
125-
PyArray1::from_slice(py, slice);
126-
});
118+
PyArray1::from_slice(py, slice);
127119
});
128120
}
129121

@@ -141,3 +133,13 @@ fn from_object_slice_medium(bencher: &mut Bencher) {
141133
fn from_object_slice_large(bencher: &mut Bencher) {
142134
from_object_slice(bencher, 2_usize.pow(15));
143135
}
136+
137+
fn iter_with_gil(bencher: &mut Bencher, mut f: impl FnMut(Python)) {
138+
Python::with_gil(|py| {
139+
bencher.iter(|| {
140+
let pool = unsafe { py.new_pool() };
141+
142+
f(pool.python());
143+
});
144+
});
145+
}

0 commit comments

Comments
 (0)