changeset 481:2190a3c01f1e

Add benchmark for skipmap
author Lewin Bormann <lbo@spheniscida.de>
date Fri, 19 Jul 2019 14:36:21 +0200
parents 7466f5240d1f
children 6d48f2046c29
files Cargo.toml src/benches/maps_bench.rs
diffstat 2 files changed, 90 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/Cargo.toml	Fri Jul 19 13:58:16 2019 +0200
+++ b/Cargo.toml	Fri Jul 19 14:36:21 2019 +0200
@@ -19,6 +19,13 @@
 
 [dev-dependencies]
 time-test = "0.2"
+bencher = "0.1"
+
+[[bench]]
+name = "maps_bench"
+harness = false
+path = "src/benches/maps_bench.rs"
 
 [workspace]
 members = ["examples/write-a-lot", "examples/leveldb-tool"]
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/benches/maps_bench.rs	Fri Jul 19 14:36:21 2019 +0200
@@ -0,0 +1,83 @@
+//! Compare different implementations of bytestring->bytestring maps. This is built as separate
+//! binary.
+
+#[macro_use]
+extern crate bencher;
+extern crate rand;
+extern crate rusty_leveldb;
+
+use bencher::Bencher;
+use rand::Rng;
+
+use rusty_leveldb::DefaultCmp;
+use rusty_leveldb::SkipMap;
+
+use std::collections::HashMap;
+use std::rc::Rc;
+
+fn gen_key_val<I: Iterator<Item = char>>(
+    gen: &mut I,
+    keylen: usize,
+    vallen: usize,
+) -> (Vec<u8>, Vec<u8>) {
+    let mut key = Vec::with_capacity(keylen);
+    let mut val = Vec::with_capacity(vallen);
+
+    let mut k = 0;
+    let mut v = 0;
+    for c in gen {
+        if k < keylen {
+            key.push(c as u8);
+            k += 1;
+            continue;
+        }
+
+        if v < vallen {
+            val.push(c as u8);
+            v += 1;
+            continue;
+        }
+        break;
+    }
+    (key, val)
+}
+
+fn bench_gen_key_val(b: &mut Bencher) {
+    let mut gen = rand::thread_rng();
+    let mut gen = gen.gen_ascii_chars();
+    b.iter(|| {
+        let (k, v) = gen_key_val(&mut gen, 10, 10);
+        k.len();
+    });
+}
+
+fn bench_skipmap_insert(b: &mut Bencher) {
+    let mut gen = rand::thread_rng();
+    let mut gen = gen.gen_ascii_chars();
+
+    let mut skm = SkipMap::new(Rc::new(Box::new(DefaultCmp)));
+
+    b.iter(|| {
+        let (k, v) = gen_key_val(&mut gen, 10, 10);
+        skm.insert(k, v);
+    });
+}
+
+fn bench_hashmap_insert(b: &mut Bencher) {
+    let mut gen = rand::thread_rng();
+    let mut gen = gen.gen_ascii_chars();
+    let mut hm = HashMap::new();
+
+    b.iter(|| {
+        let (k, v) = gen_key_val(&mut gen, 10, 10);
+        hm.insert(k, v);
+    });
+}
+
+benchmark_group!(
+    basic,
+    bench_gen_key_val,
+    bench_skipmap_insert,
+    bench_hashmap_insert
+);
+benchmark_main!(basic);