From be6b17a8e21e567b763e0a8387e06a9dae18f1f6 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Wed, 9 Nov 2022 21:31:38 +0300 Subject: [PATCH] db::read -- io::Cursor instead of take --- bench.txt | 18 +++++++++--------- src/db.rs | 17 +++++++---------- 2 files changed, 16 insertions(+), 19 deletions(-) diff --git a/bench.txt b/bench.txt index d9a44b1..a61e3bd 100644 --- a/bench.txt +++ b/bench.txt @@ -3,21 +3,21 @@ 95 MB json.zip --- -hyperfine -n print -n print2 -n zip-print -w 100 -m 100 ".\target\release\chgk_ledb.exe print 444" ".\target\release\chgk_ledb.exe print2 444" ".\target\release\chgk_ledb.exe zip-print 4 84" +hyperfine -n print -n print2 -n zip-print -w 400 -m 400 ".\target\release\chgk_ledb.exe print 444" ".\target\release\chgk_ledb.exe print2 444" ".\target\release\chgk_ledb.exe zip-print 4 84" Benchmark 1: print - Time (mean ± σ): 20.0 ms ± 1.7 ms [User: 5.8 ms, System: 12.3 ms] - Range (min … max): 18.0 ms … 30.9 ms 100 runs + Time (mean ± σ): 19.0 ms ± 1.5 ms [User: 5.6 ms, System: 13.1 ms] + Range (min … max): 16.8 ms … 24.5 ms 400 runs Benchmark 2: print2 - Time (mean ± σ): 19.1 ms ± 1.2 ms [User: 5.7 ms, System: 12.3 ms] - Range (min … max): 17.2 ms … 22.1 ms 100 runs + Time (mean ± σ): 18.6 ms ± 1.6 ms [User: 5.5 ms, System: 12.6 ms] + Range (min … max): 16.1 ms … 29.5 ms 400 runs Benchmark 3: zip-print - Time (mean ± σ): 41.1 ms ± 1.4 ms [User: 16.1 ms, System: 22.2 ms] - Range (min … max): 38.9 ms … 45.4 ms 100 runs + Time (mean ± σ): 40.8 ms ± 3.3 ms [User: 15.4 ms, System: 21.6 ms] + Range (min … max): 36.5 ms … 67.5 ms 400 runs Summary 'print2' ran - 1.05 ± 0.11 times faster than 'print' - 2.16 ± 0.15 times faster than 'zip-print' + 1.02 ± 0.12 times faster than 'print' + 2.20 ± 0.26 times faster than 'zip-print' diff --git a/src/db.rs b/src/db.rs index a05888f..ad113ca 100644 --- a/src/db.rs +++ b/src/db.rs @@ -191,28 +191,25 @@ where return Err("index out of range".into()); } + let next_pos: usize = (index + 1) * LEN_SIZE; + let next_end: usize = next_pos + LEN_SIZE; + // read item data pos let data_pos = if 0 == index { self.first_pos } else { let tab_pos: usize = index * LEN_SIZE; - let pos_curr_data: [u8; LEN_SIZE] = self.mmap[tab_pos..(tab_pos + LEN_SIZE)] - .try_into() - .str_err()?; + let pos_curr_data: [u8; LEN_SIZE] = + self.mmap[tab_pos..next_pos].try_into().str_err()?; LSize::from_le_bytes(pos_curr_data) } as usize; // read next item pos - let next_pos: usize = (index + 1) * LEN_SIZE; - let pos_next_data: [u8; LEN_SIZE] = self.mmap[next_pos..(next_pos + LEN_SIZE)] - .try_into() - .str_err()?; + let pos_next_data: [u8; LEN_SIZE] = self.mmap[next_pos..next_end].try_into().str_err()?; let data_pos_next = LSize::from_le_bytes(pos_next_data) as usize; - // calc item data length - let data_len = data_pos_next - data_pos; // read & unpack item data - let reader = self.mmap[data_pos..data_pos_next].take(data_len as u64); + let reader = io::Cursor::new(self.mmap[data_pos..data_pos_next].as_ref()); let data = zstd::decode_all(reader).str_err()?; // decode item