@@ -9,62 +9,90 @@ use std::{hint::black_box, ptr};
99/// Benchmark mdbx_dbi_flags_ex in isolation (on already-open DBI)
1010fn bench_dbi_flags_ex_only ( c : & mut Criterion ) {
1111 let ( _dir, env) = setup_bench_db ( 10 ) ;
12- let txn = env. begin_ro_txn ( ) . unwrap ( ) ;
13- let db = txn. open_db ( None ) . unwrap ( ) ;
14- let dbi = db. dbi ( ) ;
12+
13+ let txn = unsafe {
14+ let mut txn: * mut MDBX_txn = ptr:: null_mut ( ) ;
15+ env. with_raw_env_ptr ( |env_ptr| {
16+ txn = create_ro_raw ( env_ptr) ;
17+ } ) ;
18+ txn
19+ } ;
20+
21+ let mut dbi: MDBX_dbi = 0 ;
22+ let flags = 0 ;
23+ match unsafe { mdbx_dbi_open ( txn, ptr:: null ( ) , flags, & mut dbi) } {
24+ MDBX_SUCCESS | MDBX_RESULT_TRUE => { }
25+ err => panic ! ( "mdbx_dbi_open failed: {}" , err) ,
26+ } ;
1527
1628 c. bench_function ( "db_cache::ffi::flags" , |b| {
1729 b. iter ( || {
18- txn. txn_execute ( |txn_ptr| unsafe {
19- let mut flags: u32 = 0 ;
20- let mut state: u32 = 0 ;
21- black_box ( mdbx_dbi_flags_ex ( txn_ptr. cast_const ( ) , dbi, & mut flags, & mut state) ) ;
22- } )
23- . unwrap ( ) ;
30+ let mut flags: u32 = 0 ;
31+ let mut state: u32 = 0 ;
32+ black_box ( unsafe { mdbx_dbi_flags_ex ( txn. cast_const ( ) , dbi, & mut flags, & mut state) } ) ;
2433 } )
2534 } ) ;
2635}
2736
2837/// Baseline: just mdbx_dbi_open without flags_ex
2938fn bench_dbi_open_only ( c : & mut Criterion ) {
3039 let ( _dir, env) = setup_bench_db ( 10 ) ;
31- let txn = env. begin_ro_txn ( ) . unwrap ( ) ;
40+
41+ let txn = unsafe {
42+ let mut txn: * mut MDBX_txn = ptr:: null_mut ( ) ;
43+ env. with_raw_env_ptr ( |env_ptr| {
44+ txn = create_ro_raw ( env_ptr) ;
45+ } ) ;
46+ txn
47+ } ;
3248
3349 c. bench_function ( "db_cache::ffi::open" , |b| {
3450 b. iter ( || {
35- txn. txn_execute ( |txn_ptr| unsafe {
36- let mut dbi: MDBX_dbi = 0 ;
37- black_box ( mdbx_dbi_open ( txn_ptr, ptr:: null ( ) , 0 , & mut dbi) ) ;
38- } )
39- . unwrap ( ) ;
51+ let mut dbi: MDBX_dbi = 0 ;
52+ let flags = 0 ;
53+ black_box ( match unsafe { mdbx_dbi_open ( txn, ptr:: null ( ) , flags, & mut dbi) } {
54+ MDBX_SUCCESS => false ,
55+ MDBX_RESULT_TRUE => true ,
56+ _ => panic ! ( ) ,
57+ } ) ;
4058 } )
4159 } ) ;
4260}
4361
4462/// Full open path: mdbx_dbi_open + mdbx_dbi_flags_ex
4563fn bench_dbi_open_with_flags_ex ( c : & mut Criterion ) {
4664 let ( _dir, env) = setup_bench_db ( 10 ) ;
47- let txn = env. begin_ro_txn ( ) . unwrap ( ) ;
65+
66+ let txn = unsafe {
67+ let mut txn: * mut MDBX_txn = ptr:: null_mut ( ) ;
68+ env. with_raw_env_ptr ( |env_ptr| {
69+ txn = create_ro_raw ( env_ptr) ;
70+ } ) ;
71+ txn
72+ } ;
4873
4974 c. bench_function ( "db_cache::ffi::open_plus_flags" , |b| {
5075 b. iter ( || {
51- txn. txn_execute ( |txn_ptr| unsafe {
52- let mut dbi: MDBX_dbi = 0 ;
53- mdbx_dbi_open ( txn_ptr, ptr:: null ( ) , 0 , & mut dbi) ;
54- let mut flags: u32 = 0 ;
55- let mut state: u32 = 0 ;
56- black_box ( mdbx_dbi_flags_ex ( txn_ptr. cast_const ( ) , dbi, & mut flags, & mut state) ) ;
57- } )
58- . unwrap ( ) ;
59- } )
76+ let mut dbi: MDBX_dbi = 0 ;
77+ let flags = 0 ;
78+ black_box ( match unsafe { mdbx_dbi_open ( txn, ptr:: null ( ) , flags, & mut dbi) } {
79+ MDBX_SUCCESS => false ,
80+ MDBX_RESULT_TRUE => true ,
81+ _ => panic ! ( ) ,
82+ } ) ;
83+ let mut flags: u32 = 0 ;
84+ let mut state: u32 = 0 ;
85+ black_box ( unsafe { mdbx_dbi_flags_ex ( txn. cast_const ( ) , dbi, & mut flags, & mut state) } ) ;
86+ } ) ;
6087 } ) ;
6188}
6289
6390/// Benchmark cached DB opens (cache hits after first call)
6491fn bench_open_db_cached ( c : & mut Criterion ) {
6592 let ( _dir, env) = setup_bench_db ( 10 ) ;
66- let txn = env . begin_ro_txn ( ) . unwrap ( ) ;
93+
6794 // Prime the cache
95+ let txn = env. begin_ro_unsync ( ) . unwrap ( ) ;
6896 let _ = txn. open_db ( None ) . unwrap ( ) ;
6997
7098 c. bench_function ( "db_cache::unnamed::hit" , |b| {
@@ -75,7 +103,7 @@ fn bench_open_db_cached(c: &mut Criterion) {
75103/// Benchmark uncached DB opens (always FFI call)
76104fn bench_open_db_no_cache ( c : & mut Criterion ) {
77105 let ( _dir, env) = setup_bench_db ( 10 ) ;
78- let txn = env. begin_ro_txn ( ) . unwrap ( ) ;
106+ let txn = env. begin_ro_unsync ( ) . unwrap ( ) ;
79107
80108 c. bench_function ( "db_cache::unnamed::disabled" , |b| {
81109 b. iter ( || black_box ( txn. open_db_no_cache ( None ) . unwrap ( ) ) )
@@ -85,7 +113,7 @@ fn bench_open_db_no_cache(c: &mut Criterion) {
85113/// Benchmark cached DB opens (cache hits after first call)
86114fn bench_open_db_cached_named ( c : & mut Criterion ) {
87115 let ( _dir, env) = setup_bench_db ( 10 ) ;
88- let txn = env. begin_ro_txn ( ) . unwrap ( ) ;
116+ let txn = env. begin_ro_unsync ( ) . unwrap ( ) ;
89117 // Prime the cache
90118 let _ = txn. open_db ( Some ( NAMED_DB ) ) . unwrap ( ) ;
91119
@@ -97,7 +125,7 @@ fn bench_open_db_cached_named(c: &mut Criterion) {
97125/// Benchmark uncached DB opens (always FFI call)
98126fn bench_open_db_no_cache_named ( c : & mut Criterion ) {
99127 let ( _dir, env) = setup_bench_db ( 10 ) ;
100- let txn = env. begin_ro_txn ( ) . unwrap ( ) ;
128+ let txn = env. begin_ro_unsync ( ) . unwrap ( ) ;
101129
102130 c. bench_function ( "db_cache::named::disabled" , |b| {
103131 b. iter ( || black_box ( txn. open_db_no_cache ( Some ( NAMED_DB ) ) . unwrap ( ) ) )
0 commit comments