Skip to content

Instantly share code, notes, and snippets.

@mappum
Last active May 11, 2019 17:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mappum/3323a386203e506aa893a5f3d7622a72 to your computer and use it in GitHub Desktop.
Save mappum/3323a386203e506aa893a5f3d7622a72 to your computer and use it in GitHub Desktop.
extern crate time;
extern crate rocksdb;
extern crate rand;
use rand::prelude::*;
const NODES: u64 = 10000000;
const KEY_LENGTH: usize = 30;
const DATA_LENGTH: usize = 200;
macro_rules! benchmark {
( $name:expr , $n:expr , $code:block ) => {
let start = time::precise_time_ns();
for _ in 0..$n {
$code
}
let elapsed = time::precise_time_ns() - start;
let ops_per_s = $n as f64 / (elapsed as f64 / 1e9);
println!("{:?}: {:?} ops/s", $name, ops_per_s as u64);
}
}
fn main() {
let mut rng = rand::thread_rng();
let db = rocksdb::DB::open_default("temp.db").unwrap();
benchmark!("write random keys", NODES, {
let key = random_bytes(&mut rng, KEY_LENGTH);
let value = random_bytes(&mut rng, DATA_LENGTH);
db.put(key, value).unwrap();
});
let mut range_benchmark = |range_size| {
benchmark!(
format!(
"read random ranges ({}-node, {}B chunks)",
range_size,
(KEY_LENGTH + DATA_LENGTH) as u64 * range_size
),
NODES / range_size,
{
let key = random_bytes(&mut rng, KEY_LENGTH);
let iter = db.iterator(
rocksdb::IteratorMode::From(
key.as_slice(),
rocksdb::Direction::Forward
)
);
let mut i = 0;
for (_key, _value) in iter {
i += 1;
if i == range_size { break };
}
}
);
};
for i in 5..15 {
range_benchmark(2_u64.pow(i));
}
}
fn random_bytes(rng: &mut ThreadRng, length: usize) -> Vec<u8> {
(0..length).map(|_| -> u8 {
rng.gen()
}).collect()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment