You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
107 lines
2.8 KiB
107 lines
2.8 KiB
6 years ago
|
#![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);
|
||
|
});
|
||
|
}
|