#![feature(test)] extern crate lmdb; extern crate lmdb_rkv_sys as ffi; extern crate test; mod utils; use ffi::*; use lmdb::{Cursor, Result, RoCursor, Transaction}; use std::ptr; use test::{Bencher, black_box}; use utils::*; /// Benchmark of iterator sequential read performance. #[bench] fn bench_get_seq_iter(b: &mut Bencher) { let n = 100; let (_dir, env) = setup_bench_db(n); let db = env.open_db(None).unwrap(); let txn = env.begin_ro_txn().unwrap(); b.iter(|| { let mut cursor = txn.open_ro_cursor(db).unwrap(); let mut i = 0; let mut count = 0u32; for (key, data) in cursor.iter().map(Result::unwrap) { i = i + key.len() + data.len(); count = count + 1; } for (key, data) in cursor.iter().filter_map(Result::ok) { i = i + key.len() + data.len(); count = count + 1; } fn iterate<'a>(cursor: &mut RoCursor) -> Result<()> { let mut i = 0; let mut count = 0u32; for result in cursor.iter() { let (key, data) = result?; i = i + key.len() + data.len(); count = count + 1; } Ok(()) } iterate(&mut cursor).unwrap(); black_box(i); assert_eq!(count, n); }); } /// Benchmark of cursor sequential read performance. #[bench] fn bench_get_seq_cursor(b: &mut Bencher) { let n = 100; let (_dir, env) = setup_bench_db(n); let db = env.open_db(None).unwrap(); let txn = env.begin_ro_txn().unwrap(); b.iter(|| { let cursor = txn.open_ro_cursor(db).unwrap(); let mut i = 0; let mut count = 0u32; while let Ok((key_opt, val)) = cursor.get(None, None, MDB_NEXT) { i += key_opt.map(|key| key.len()).unwrap_or(0) + val.len(); count += 1; } black_box(i); assert_eq!(count, n); }); } /// Benchmark of raw LMDB sequential read performance (control). #[bench] fn bench_get_seq_raw(b: &mut Bencher) { let n = 100; let (_dir, env) = setup_bench_db(n); let db = env.open_db(None).unwrap(); let dbi: MDB_dbi = db.dbi(); let _txn = env.begin_ro_txn().unwrap(); let txn = _txn.txn(); let mut key = MDB_val { mv_size: 0, mv_data: ptr::null_mut() }; let mut data = MDB_val { mv_size: 0, mv_data: ptr::null_mut() }; let mut cursor: *mut MDB_cursor = ptr::null_mut(); b.iter(|| unsafe { mdb_cursor_open(txn, dbi, &mut cursor); let mut i = 0; let mut count = 0u32; while mdb_cursor_get(cursor, &mut key, &mut data, MDB_NEXT) == 0 { i += key.mv_size + data.mv_size; count += 1; }; black_box(i); assert_eq!(count, n); mdb_cursor_close(cursor); }); }