Skip to content

Commit 3c9bcf3

Browse files
committed
Don't recompile cpython code at each run
1 parent 66ae849 commit 3c9bcf3

File tree

1 file changed

+42
-3
lines changed

1 file changed

+42
-3
lines changed

benches/microbenchmarks.rs

+42-3
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ fn bench_cpython_code(group: &mut BenchmarkGroup<WallTime>, bench: &MicroBenchma
2020
let gil = cpython::Python::acquire_gil();
2121
let py = gil.python();
2222

23-
let bench_func = |(globals, locals)| {
24-
let res = py.run(&bench.code, Some(&globals), Some(&locals));
23+
let bench_func = |(code, globals, locals)| {
24+
let res = cpy_run_code(py, &code, &globals, &locals);
2525
if let Err(e) = res {
2626
e.print(py);
2727
panic!("Error running microbenchmark")
@@ -40,7 +40,10 @@ fn bench_cpython_code(group: &mut BenchmarkGroup<WallTime>, bench: &MicroBenchma
4040
e.print(py);
4141
panic!("Error running microbenchmark setup code")
4242
}
43-
(globals, locals)
43+
let code = std::ffi::CString::new(&*bench.code).unwrap();
44+
let name = std::ffi::CString::new(&*bench.name).unwrap();
45+
let code = cpy_compile_code(py, &code, &name).unwrap();
46+
(code, globals, locals)
4447
};
4548

4649
if bench.iterate {
@@ -61,6 +64,42 @@ fn bench_cpython_code(group: &mut BenchmarkGroup<WallTime>, bench: &MicroBenchma
6164
}
6265
}
6366

67+
unsafe fn cpy_res(
68+
py: cpython::Python<'_>,
69+
x: *mut python3_sys::PyObject,
70+
) -> cpython::PyResult<cpython::PyObject> {
71+
cpython::PyObject::from_owned_ptr_opt(py, x).ok_or_else(|| cpython::PyErr::fetch(py))
72+
}
73+
74+
fn cpy_compile_code(
75+
py: cpython::Python<'_>,
76+
s: &std::ffi::CStr,
77+
fname: &std::ffi::CStr,
78+
) -> cpython::PyResult<cpython::PyObject> {
79+
unsafe {
80+
let res =
81+
python3_sys::Py_CompileString(s.as_ptr(), fname.as_ptr(), python3_sys::Py_file_input);
82+
cpy_res(py, res)
83+
}
84+
}
85+
86+
fn cpy_run_code(
87+
py: cpython::Python<'_>,
88+
code: &cpython::PyObject,
89+
locals: &cpython::PyDict,
90+
globals: &cpython::PyDict,
91+
) -> cpython::PyResult<cpython::PyObject> {
92+
use cpython::PythonObject;
93+
unsafe {
94+
let res = python3_sys::PyEval_EvalCode(
95+
code.as_ptr(),
96+
locals.as_object().as_ptr(),
97+
globals.as_object().as_ptr(),
98+
);
99+
cpy_res(py, res)
100+
}
101+
}
102+
64103
fn bench_rustpy_code(group: &mut BenchmarkGroup<WallTime>, bench: &MicroBenchmark) {
65104
let mut settings = PySettings::default();
66105
settings.path_list.push("Lib/".to_string());

0 commit comments

Comments
 (0)