Skip to content

Commit

Permalink
core: Track the number of bytes read when iterating over the WAL
Browse files Browse the repository at this point in the history
Mainly for providing additional error context when commit decoding fails.
  • Loading branch information
kim committed Nov 8, 2023
1 parent dff23de commit 5998a69
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 4 deletions.
19 changes: 16 additions & 3 deletions crates/core/src/db/commit_log.rs
Original file line number Diff line number Diff line change
Expand Up @@ -289,13 +289,27 @@ struct IterSegment {
inner: message_log::IterSegment,
}

impl IterSegment {
fn bytes_read(&self) -> u64 {
self.inner.bytes_read()
}
}

impl Iterator for IterSegment {
type Item = io::Result<Commit>;

fn next(&mut self) -> Option<Self::Item> {
let next = self.inner.next()?;

let ctx = || {
format!(
"Failed to decode commit in segment {:0>20} at byte offset: {}",
self.inner.segment(),
self.bytes_read()
)
};
let io = |e| io::Error::new(io::ErrorKind::InvalidData, e);
Some(next.and_then(|bytes| Commit::decode(&mut bytes.as_slice()).map_err(io)))
Some(next.and_then(|bytes| Commit::decode(&mut bytes.as_slice()).with_context(ctx).map_err(io)))
}
}

Expand All @@ -314,9 +328,8 @@ impl Iterator for Iter {

fn next(&mut self) -> Option<Self::Item> {
loop {
if let Some(mut commits) = self.commits.take() {
if let Some(commits) = self.commits.as_mut() {
if let Some(commit) = commits.next() {
self.commits = Some(commits);
return Some(commit);
}
}
Expand Down
20 changes: 19 additions & 1 deletion crates/core/src/db/message_log.rs
Original file line number Diff line number Diff line change
Expand Up @@ -335,9 +335,10 @@ impl TryFrom<SegmentView> for IterSegment {
type Error = io::Error;

fn try_from(view: SegmentView) -> Result<Self, Self::Error> {
let segment = view.offset();
File::try_from(view)
.map(BufReader::new)
.map(|file| IterSegment { file })
.map(|file| IterSegment { segment, read: 0, file })
}
}

Expand All @@ -354,10 +355,25 @@ impl TryFrom<SegmentView> for File {
/// Created by [`SegmentView::try_iter`].
#[must_use = "iterators are lazy and do nothing unless consumed"]
pub struct IterSegment {
segment: u64,
read: u64,
file: BufReader<File>,
}

impl IterSegment {
/// Return the id of the segment being iterated over.
///
/// The segment id is the `min_offset`, but that information is not
/// meaningful here -- the value returned should be treated as opaque.
pub fn segment(&self) -> u64 {
self.segment
}

/// Return the number of bytes read from the segment file so far.
pub fn bytes_read(&self) -> u64 {
self.read
}

fn read_exact_or_none(&mut self, buf: &mut [u8]) -> Option<io::Result<()>> {
match self.file.read_exact(buf) {
Err(e) if e.kind() == io::ErrorKind::UnexpectedEof => None,
Expand All @@ -375,12 +391,14 @@ impl Iterator for IterSegment {
if let Err(e) = self.read_exact_or_none(&mut buf)? {
return Some(Err(e));
}
self.read += HEADER_SIZE as u64;

let message_len = u32::from_le_bytes(buf);
let mut buf = vec![0; message_len as usize];
if let Err(e) = self.read_exact_or_none(&mut buf)? {
return Some(Err(e));
}
self.read += message_len as u64;

Some(Ok(buf))
}
Expand Down

1 comment on commit 5998a69

@github-actions
Copy link

@github-actions github-actions bot commented on 5998a69 Nov 8, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmark results

Benchmark Report

Legend:

  • load: number of rows pre-loaded into the database
  • count: number of rows touched by the transaction
  • index types:
    • unique: a single index on the id column
    • non_unique: no indexes
    • multi_index: non-unique index on every column
  • schemas:
    • person(id: u32, name: String, age: u64)
    • location(id: u32, x: u64, y: u64)

All throughputs are single-threaded.

Empty transaction

db on disk new latency old latency new throughput old throughput
sqlite 💿 431.5±1.20ns 447.1±1.54ns - -
sqlite 🧠 424.1±1.92ns 437.2±1.47ns - -
stdb_module 💿 17.6±0.85µs 18.0±1.03µs - -
stdb_module 🧠 18.2±1.32µs 18.1±1.45µs - -
stdb_raw 💿 709.7±1.34ns 714.5±1.94ns - -
stdb_raw 🧠 709.2±0.70ns 710.5±1.91ns - -

Single-row insertions

db on disk schema index type load new latency old latency new throughput old throughput
sqlite 💿 location multi_index 0 15.0±1.72µs 15.0±1.53µs 65.1 Ktx/sec 65.2 Ktx/sec
sqlite 💿 location multi_index 1000 15.7±0.13µs 15.9±0.11µs 62.3 Ktx/sec 61.3 Ktx/sec
sqlite 💿 location non_unique 0 7.3±0.54µs 7.2±0.04µs 133.0 Ktx/sec 136.1 Ktx/sec
sqlite 💿 location non_unique 1000 7.1±0.04µs 7.0±0.03µs 137.5 Ktx/sec 138.9 Ktx/sec
sqlite 💿 location unique 0 7.3±0.04µs 7.5±0.23µs 134.3 Ktx/sec 129.5 Ktx/sec
sqlite 💿 location unique 1000 7.2±0.04µs 7.1±0.06µs 135.7 Ktx/sec 137.1 Ktx/sec
sqlite 💿 person multi_index 0 14.7±0.77µs 14.7±0.58µs 66.6 Ktx/sec 66.6 Ktx/sec
sqlite 💿 person multi_index 1000 16.5±4.50µs 16.3±0.11µs 59.1 Ktx/sec 60.0 Ktx/sec
sqlite 💿 person non_unique 0 7.3±0.04µs 7.4±0.63µs 133.1 Ktx/sec 132.1 Ktx/sec
sqlite 💿 person non_unique 1000 7.3±0.03µs 7.3±0.03µs 134.2 Ktx/sec 134.2 Ktx/sec
sqlite 💿 person unique 0 7.5±0.93µs 7.4±0.68µs 130.8 Ktx/sec 132.5 Ktx/sec
sqlite 💿 person unique 1000 7.3±0.04µs 7.2±0.05µs 133.6 Ktx/sec 135.2 Ktx/sec
sqlite 🧠 location multi_index 0 4.0±0.02µs 4.0±0.01µs 243.1 Ktx/sec 242.4 Ktx/sec
sqlite 🧠 location multi_index 1000 5.2±0.05µs 5.2±0.03µs 188.5 Ktx/sec 188.4 Ktx/sec
sqlite 🧠 location non_unique 0 1850.3±6.61ns 1814.9±4.06ns 527.8 Ktx/sec 538.1 Ktx/sec
sqlite 🧠 location non_unique 1000 1916.1±12.84ns 1852.0±10.07ns 509.7 Ktx/sec 527.3 Ktx/sec
sqlite 🧠 location unique 0 1854.0±4.23ns 1792.3±9.52ns 526.7 Ktx/sec 544.9 Ktx/sec
sqlite 🧠 location unique 1000 1965.9±13.33ns 1917.3±15.13ns 496.7 Ktx/sec 509.4 Ktx/sec
sqlite 🧠 person multi_index 0 3.7±0.01µs 3.6±0.02µs 267.0 Ktx/sec 269.6 Ktx/sec
sqlite 🧠 person multi_index 1000 5.5±0.05µs 5.4±0.06µs 178.9 Ktx/sec 182.1 Ktx/sec
sqlite 🧠 person non_unique 0 1899.6±13.64ns 1904.0±5.44ns 514.1 Ktx/sec 512.9 Ktx/sec
sqlite 🧠 person non_unique 1000 1983.9±11.87ns 1957.1±11.33ns 492.3 Ktx/sec 499.0 Ktx/sec
sqlite 🧠 person unique 0 1911.9±20.02ns 1877.0±8.12ns 510.8 Ktx/sec 520.3 Ktx/sec
sqlite 🧠 person unique 1000 2.0±0.02µs 1996.3±15.32ns 482.5 Ktx/sec 489.2 Ktx/sec
stdb_module 💿 location multi_index 0 59.1±6.37µs 59.1±3.83µs 16.5 Ktx/sec 16.5 Ktx/sec
stdb_module 💿 location multi_index 1000 309.3±10.61µs 264.6±5.28µs 3.2 Ktx/sec 3.7 Ktx/sec
stdb_module 💿 location non_unique 0 43.0±6.42µs 49.9±4.53µs 22.7 Ktx/sec 19.6 Ktx/sec
stdb_module 💿 location non_unique 1000 99.7±131.08µs 250.6±15.60µs 9.8 Ktx/sec 3.9 Ktx/sec
stdb_module 💿 location unique 0 53.8±5.67µs 56.8±3.71µs 18.1 Ktx/sec 17.2 Ktx/sec
stdb_module 💿 location unique 1000 148.3±4.91µs 264.2±8.14µs 6.6 Ktx/sec 3.7 Ktx/sec
stdb_module 💿 person multi_index 0 67.9±3.49µs 62.8±5.22µs 14.4 Ktx/sec 15.5 Ktx/sec
stdb_module 💿 person multi_index 1000 290.1±130.03µs 165.9±119.38µs 3.4 Ktx/sec 5.9 Ktx/sec
stdb_module 💿 person non_unique 0 46.5±6.19µs 50.2±5.61µs 21.0 Ktx/sec 19.5 Ktx/sec
stdb_module 💿 person non_unique 1000 292.0±6.31µs 170.1±35.12µs 3.3 Ktx/sec 5.7 Ktx/sec
stdb_module 💿 person unique 0 55.1±4.87µs 58.8±6.03µs 17.7 Ktx/sec 16.6 Ktx/sec
stdb_module 💿 person unique 1000 134.2±15.88µs 136.0±32.75µs 7.3 Ktx/sec 7.2 Ktx/sec
stdb_module 🧠 location multi_index 0 37.8±3.04µs 38.6±3.77µs 25.8 Ktx/sec 25.3 Ktx/sec
stdb_module 🧠 location multi_index 1000 92.8±2.12µs 141.0±34.66µs 10.5 Ktx/sec 6.9 Ktx/sec
stdb_module 🧠 location non_unique 0 32.7±2.89µs 31.4±2.19µs 29.8 Ktx/sec 31.1 Ktx/sec
stdb_module 🧠 location non_unique 1000 103.4±3.31µs 108.5±3.18µs 9.4 Ktx/sec 9.0 Ktx/sec
stdb_module 🧠 location unique 0 36.0±3.29µs 34.6±3.46µs 27.1 Ktx/sec 28.2 Ktx/sec
stdb_module 🧠 location unique 1000 111.2±2.76µs 187.5±6.68µs 8.8 Ktx/sec 5.2 Ktx/sec
stdb_module 🧠 person multi_index 0 45.9±4.44µs 44.0±5.12µs 21.3 Ktx/sec 22.2 Ktx/sec
stdb_module 🧠 person multi_index 1000 282.7±6.37µs 177.8±33.98µs 3.5 Ktx/sec 5.5 Ktx/sec
stdb_module 🧠 person non_unique 0 32.1±3.17µs 32.7±2.83µs 30.4 Ktx/sec 29.8 Ktx/sec
stdb_module 🧠 person non_unique 1000 294.2±4.60µs 196.5±19.61µs 3.3 Ktx/sec 5.0 Ktx/sec
stdb_module 🧠 person unique 0 39.0±3.59µs 37.6±3.00µs 25.0 Ktx/sec 26.0 Ktx/sec
stdb_module 🧠 person unique 1000 111.4±10.62µs 263.4±13.36µs 8.8 Ktx/sec 3.7 Ktx/sec
stdb_raw 💿 location multi_index 0 7.2±0.03µs 7.3±0.02µs 135.9 Ktx/sec 134.7 Ktx/sec
stdb_raw 💿 location multi_index 1000 9.8±0.17µs 9.9±0.39µs 99.4 Ktx/sec 98.2 Ktx/sec
stdb_raw 💿 location non_unique 0 4.8±0.01µs 4.8±0.02µs 201.7 Ktx/sec 203.0 Ktx/sec
stdb_raw 💿 location non_unique 1000 16.9±106.26µs 17.5±113.08µs 57.8 Ktx/sec 55.9 Ktx/sec
stdb_raw 💿 location unique 0 6.2±0.07µs 6.2±0.03µs 158.5 Ktx/sec 158.7 Ktx/sec
stdb_raw 💿 location unique 1000 8.4±0.24µs 8.5±0.14µs 116.2 Ktx/sec 115.3 Ktx/sec
stdb_raw 💿 person multi_index 0 10.9±0.01µs 10.9±0.03µs 90.0 Ktx/sec 89.5 Ktx/sec
stdb_raw 💿 person multi_index 1000 14.0±0.16µs 77.6±449.91µs 69.7 Ktx/sec 12.6 Ktx/sec
stdb_raw 💿 person non_unique 0 5.5±0.65µs 5.4±0.02µs 179.0 Ktx/sec 181.1 Ktx/sec
stdb_raw 💿 person non_unique 1000 7.0±0.08µs 17.8±107.83µs 140.5 Ktx/sec 54.8 Ktx/sec
stdb_raw 💿 person unique 0 7.7±0.02µs 7.8±0.32µs 127.3 Ktx/sec 125.5 Ktx/sec
stdb_raw 💿 person unique 1000 10.1±0.13µs 33.8±235.59µs 96.2 Ktx/sec 28.9 Ktx/sec
stdb_raw 🧠 location multi_index 0 4.2±0.01µs 4.2±0.01µs 234.6 Ktx/sec 232.5 Ktx/sec
stdb_raw 🧠 location multi_index 1000 5.8±0.07µs 5.8±0.04µs 168.0 Ktx/sec 168.4 Ktx/sec
stdb_raw 🧠 location non_unique 0 1926.0±4.42ns 1935.9±6.50ns 507.0 Ktx/sec 504.4 Ktx/sec
stdb_raw 🧠 location non_unique 1000 2.5±0.02µs 2.4±0.01µs 394.0 Ktx/sec 406.7 Ktx/sec
stdb_raw 🧠 location unique 0 3.2±0.00µs 3.2±0.01µs 308.2 Ktx/sec 303.9 Ktx/sec
stdb_raw 🧠 location unique 1000 4.2±0.03µs 4.3±0.03µs 230.1 Ktx/sec 226.2 Ktx/sec
stdb_raw 🧠 person multi_index 0 7.8±0.02µs 7.8±0.05µs 125.2 Ktx/sec 125.1 Ktx/sec
stdb_raw 🧠 person multi_index 1000 9.9±0.05µs 9.9±0.05µs 98.3 Ktx/sec 98.3 Ktx/sec
stdb_raw 🧠 person non_unique 0 2.5±0.01µs 2.5±0.01µs 393.5 Ktx/sec 387.3 Ktx/sec
stdb_raw 🧠 person non_unique 1000 3.2±0.02µs 3.2±0.03µs 305.9 Ktx/sec 303.5 Ktx/sec
stdb_raw 🧠 person unique 0 4.7±0.03µs 4.7±0.01µs 208.6 Ktx/sec 205.9 Ktx/sec
stdb_raw 🧠 person unique 1000 6.1±0.17µs 6.3±0.03µs 159.3 Ktx/sec 155.3 Ktx/sec

Multi-row insertions

db on disk schema index type load count new latency old latency new throughput old throughput
sqlite 💿 location multi_index 0 100 131.6±3.99µs 133.2±0.44µs 7.4 Ktx/sec 7.3 Ktx/sec
sqlite 💿 location multi_index 1000 100 201.2±1.56µs 206.1±1.43µs 4.9 Ktx/sec 4.7 Ktx/sec
sqlite 💿 location non_unique 0 100 51.6±1.35µs 51.4±1.04µs 18.9 Ktx/sec 19.0 Ktx/sec
sqlite 💿 location non_unique 1000 100 54.6±0.29µs 52.7±0.34µs 17.9 Ktx/sec 18.5 Ktx/sec
sqlite 💿 location unique 0 100 53.1±1.59µs 52.0±0.44µs 18.4 Ktx/sec 18.8 Ktx/sec
sqlite 💿 location unique 1000 100 58.4±10.89µs 56.2±0.25µs 16.7 Ktx/sec 17.4 Ktx/sec
sqlite 💿 person multi_index 0 100 118.0±2.95µs 118.0±3.60µs 8.3 Ktx/sec 8.3 Ktx/sec
sqlite 💿 person multi_index 1000 100 232.6±16.84µs 235.7±2.20µs 4.2 Ktx/sec 4.1 Ktx/sec
sqlite 💿 person non_unique 0 100 48.1±0.44µs 48.8±0.46µs 20.3 Ktx/sec 20.0 Ktx/sec
sqlite 💿 person non_unique 1000 100 59.7±0.51µs 60.4±0.31µs 16.4 Ktx/sec 16.2 Ktx/sec
sqlite 💿 person unique 0 100 50.3±2.14µs 48.9±1.23µs 19.4 Ktx/sec 20.0 Ktx/sec
sqlite 💿 person unique 1000 100 54.7±0.26µs 55.0±0.43µs 17.8 Ktx/sec 17.7 Ktx/sec
sqlite 🧠 location multi_index 0 100 119.2±0.70µs 123.5±0.29µs 8.2 Ktx/sec 7.9 Ktx/sec
sqlite 🧠 location multi_index 1000 100 169.3±0.42µs 172.2±0.52µs 5.8 Ktx/sec 5.7 Ktx/sec
sqlite 🧠 location non_unique 0 100 44.6±0.42µs 44.2±0.58µs 21.9 Ktx/sec 22.1 Ktx/sec
sqlite 🧠 location non_unique 1000 100 45.0±0.35µs 44.3±0.56µs 21.7 Ktx/sec 22.0 Ktx/sec
sqlite 🧠 location unique 0 100 46.4±0.41µs 45.9±0.41µs 21.0 Ktx/sec 21.3 Ktx/sec
sqlite 🧠 location unique 1000 100 48.9±0.32µs 48.9±0.28µs 20.0 Ktx/sec 20.0 Ktx/sec
sqlite 🧠 person multi_index 0 100 106.0±0.40µs 105.8±0.48µs 9.2 Ktx/sec 9.2 Ktx/sec
sqlite 🧠 person multi_index 1000 100 187.5±0.34µs 187.8±0.27µs 5.2 Ktx/sec 5.2 Ktx/sec
sqlite 🧠 person non_unique 0 100 41.9±0.40µs 42.1±0.34µs 23.3 Ktx/sec 23.2 Ktx/sec
sqlite 🧠 person non_unique 1000 100 44.9±0.57µs 45.3±0.28µs 21.8 Ktx/sec 21.6 Ktx/sec
sqlite 🧠 person unique 0 100 43.1±0.39µs 42.9±0.45µs 22.7 Ktx/sec 22.8 Ktx/sec
sqlite 🧠 person unique 1000 100 46.5±0.38µs 46.4±0.37µs 21.0 Ktx/sec 21.0 Ktx/sec
stdb_module 💿 location multi_index 0 100 999.0±84.66µs 1082.0±6.50µs 1000 tx/sec 924 tx/sec
stdb_module 💿 location multi_index 1000 100 712.9±10.33µs 1308.3±8.82µs 1402 tx/sec 764 tx/sec
stdb_module 💿 location non_unique 0 100 460.6±72.47µs 516.6±97.65µs 2.1 Ktx/sec 1935 tx/sec
stdb_module 💿 location non_unique 1000 100 658.8±28.57µs 843.8±31.45µs 1517 tx/sec 1185 tx/sec
stdb_module 💿 location unique 0 100 567.1±63.05µs 684.7±110.04µs 1763 tx/sec 1460 tx/sec
stdb_module 💿 location unique 1000 100 593.7±13.24µs 706.4±17.18µs 1684 tx/sec 1415 tx/sec
stdb_module 💿 person multi_index 0 100 999.7±7.30µs 1099.8±17.04µs 1000 tx/sec 909 tx/sec
stdb_module 💿 person multi_index 1000 100 1164.2±77.08µs 1347.0±67.42µs 858 tx/sec 742 tx/sec
stdb_module 💿 person non_unique 0 100 524.1±126.55µs 721.3±121.33µs 1908 tx/sec 1386 tx/sec
stdb_module 💿 person non_unique 1000 100 1042.3±44.31µs 816.2±66.51µs 959 tx/sec 1225 tx/sec
stdb_module 💿 person unique 0 100 716.4±11.77µs 900.2±52.14µs 1395 tx/sec 1110 tx/sec
stdb_module 💿 person unique 1000 100 937.9±33.46µs 1000.7±358.84µs 1066 tx/sec 999 tx/sec
stdb_module 🧠 location multi_index 0 100 716.5±2.03µs 678.3±68.92µs 1395 tx/sec 1474 tx/sec
stdb_module 🧠 location multi_index 1000 100 709.2±68.63µs 491.9±1.85µs 1409 tx/sec 2032 tx/sec
stdb_module 🧠 location non_unique 0 100 364.8±29.89µs 334.2±3.18µs 2.7 Ktx/sec 2.9 Ktx/sec
stdb_module 🧠 location non_unique 1000 100 369.6±4.33µs 365.4±19.73µs 2.6 Ktx/sec 2.7 Ktx/sec
stdb_module 🧠 location unique 0 100 356.9±33.81µs 447.7±25.79µs 2.7 Ktx/sec 2.2 Ktx/sec
stdb_module 🧠 location unique 1000 100 379.8±2.31µs 479.0±44.05µs 2.6 Ktx/sec 2.0 Ktx/sec
stdb_module 🧠 person multi_index 0 100 965.6±6.22µs 824.2±9.70µs 1035 tx/sec 1213 tx/sec
stdb_module 🧠 person multi_index 1000 100 1094.0±6.42µs 1100.2±89.15µs 914 tx/sec 908 tx/sec
stdb_module 🧠 person non_unique 0 100 495.4±41.27µs 367.8±6.59µs 2018 tx/sec 2.7 Ktx/sec
stdb_module 🧠 person non_unique 1000 100 764.7±17.38µs 438.2±17.25µs 1307 tx/sec 2.2 Ktx/sec
stdb_module 🧠 person unique 0 100 651.1±79.81µs 520.0±15.26µs 1535 tx/sec 1923 tx/sec
stdb_module 🧠 person unique 1000 100 821.0±25.49µs 570.2±4.50µs 1217 tx/sec 1753 tx/sec
stdb_raw 💿 location multi_index 0 100 397.4±1.06µs 404.5±3.85µs 2.5 Ktx/sec 2.4 Ktx/sec
stdb_raw 💿 location multi_index 1000 100 448.5±262.51µs 430.8±1.64µs 2.2 Ktx/sec 2.3 Ktx/sec
stdb_raw 💿 location non_unique 0 100 169.6±0.17µs 175.1±0.32µs 5.8 Ktx/sec 5.6 Ktx/sec
stdb_raw 💿 location non_unique 1000 100 183.8±118.10µs 189.6±117.58µs 5.3 Ktx/sec 5.2 Ktx/sec
stdb_raw 💿 location unique 0 100 292.5±0.44µs 300.1±8.43µs 3.3 Ktx/sec 3.3 Ktx/sec
stdb_raw 💿 location unique 1000 100 329.6±191.24µs 337.2±184.80µs 3.0 Ktx/sec 2.9 Ktx/sec
stdb_raw 💿 person multi_index 0 100 721.8±10.66µs 723.0±0.83µs 1385 tx/sec 1383 tx/sec
stdb_raw 💿 person multi_index 1000 100 780.1±324.77µs 750.8±0.86µs 1281 tx/sec 1331 tx/sec
stdb_raw 💿 person non_unique 0 100 228.9±17.54µs 230.4±0.51µs 4.3 Ktx/sec 4.2 Ktx/sec
stdb_raw 💿 person non_unique 1000 100 241.4±119.78µs 232.8±0.45µs 4.0 Ktx/sec 4.2 Ktx/sec
stdb_raw 💿 person unique 0 100 435.3±0.72µs 438.8±0.35µs 2.2 Ktx/sec 2.2 Ktx/sec
stdb_raw 💿 person unique 1000 100 476.6±238.99µs 456.5±1.41µs 2.0 Ktx/sec 2.1 Ktx/sec
stdb_raw 🧠 location multi_index 0 100 297.0±2.62µs 306.6±1.17µs 3.3 Ktx/sec 3.2 Ktx/sec
stdb_raw 🧠 location multi_index 1000 100 321.2±0.43µs 331.2±0.49µs 3.0 Ktx/sec 2.9 Ktx/sec
stdb_raw 🧠 location non_unique 0 100 74.2±0.19µs 78.7±0.13µs 13.2 Ktx/sec 12.4 Ktx/sec
stdb_raw 🧠 location non_unique 1000 100 75.4±0.16µs 79.9±0.15µs 12.9 Ktx/sec 12.2 Ktx/sec
stdb_raw 🧠 location unique 0 100 196.2±0.23µs 202.6±0.29µs 5.0 Ktx/sec 4.8 Ktx/sec
stdb_raw 🧠 location unique 1000 100 216.5±1.17µs 220.5±0.35µs 4.5 Ktx/sec 4.4 Ktx/sec
stdb_raw 🧠 person multi_index 0 100 620.7±3.58µs 616.2±0.68µs 1611 tx/sec 1622 tx/sec
stdb_raw 🧠 person multi_index 1000 100 649.6±3.98µs 647.0±1.69µs 1539 tx/sec 1545 tx/sec
stdb_raw 🧠 person non_unique 0 100 126.2±0.17µs 128.9±0.13µs 7.7 Ktx/sec 7.6 Ktx/sec
stdb_raw 🧠 person non_unique 1000 100 128.4±0.42µs 131.4±0.21µs 7.6 Ktx/sec 7.4 Ktx/sec
stdb_raw 🧠 person unique 0 100 333.3±0.50µs 335.2±0.44µs 2.9 Ktx/sec 2.9 Ktx/sec
stdb_raw 🧠 person unique 1000 100 350.4±0.52µs 353.5±0.60µs 2.8 Ktx/sec 2.8 Ktx/sec

Full table iterate

db on disk schema index type new latency old latency new throughput old throughput
sqlite 💿 location unique 9.1±0.09µs 8.9±0.09µs 107.7 Ktx/sec 109.6 Ktx/sec
sqlite 💿 person unique 9.6±0.11µs 9.2±0.07µs 102.2 Ktx/sec 105.9 Ktx/sec
sqlite 🧠 location unique 7.8±0.10µs 7.8±0.03µs 125.7 Ktx/sec 126.0 Ktx/sec
sqlite 🧠 person unique 8.4±0.06µs 8.1±0.06µs 116.6 Ktx/sec 121.0 Ktx/sec
stdb_module 💿 location unique 50.2±5.82µs 50.6±4.39µs 19.4 Ktx/sec 19.3 Ktx/sec
stdb_module 💿 person unique 54.4±10.57µs 54.1±10.47µs 18.0 Ktx/sec 18.1 Ktx/sec
stdb_module 🧠 location unique 50.4±7.88µs 50.2±3.54µs 19.4 Ktx/sec 19.4 Ktx/sec
stdb_module 🧠 person unique 62.7±10.94µs 59.2±10.10µs 15.6 Ktx/sec 16.5 Ktx/sec
stdb_raw 💿 location unique 9.1±0.00µs 9.1±0.01µs 107.8 Ktx/sec 107.4 Ktx/sec
stdb_raw 💿 person unique 9.1±0.01µs 9.1±0.01µs 107.9 Ktx/sec 107.3 Ktx/sec
stdb_raw 🧠 location unique 9.0±0.00µs 9.1±0.01µs 107.9 Ktx/sec 107.5 Ktx/sec
stdb_raw 🧠 person unique 9.0±0.00µs 9.1±0.02µs 107.9 Ktx/sec 107.3 Ktx/sec

Find unique key

db on disk key type load new latency old latency new throughput old throughput
sqlite 💿 u32 1000 2.3±0.01µs 2.3±0.01µs 416.1 Ktx/sec 422.9 Ktx/sec
sqlite 🧠 u32 1000 1130.3±10.32ns 1116.5±3.72ns 864.0 Ktx/sec 874.7 Ktx/sec
stdb_module 💿 u32 1000 24.8±2.22µs 26.5±1.81µs 39.4 Ktx/sec 36.9 Ktx/sec
stdb_module 🧠 u32 1000 24.5±1.49µs 24.1±1.46µs 39.8 Ktx/sec 40.5 Ktx/sec
stdb_raw 💿 u32 1000 1880.2±3.83ns 1904.4±4.57ns 519.4 Ktx/sec 512.8 Ktx/sec
stdb_raw 🧠 u32 1000 1870.2±2.09ns 1895.4±5.43ns 522.2 Ktx/sec 515.2 Ktx/sec

Filter

db on disk key type index strategy load count new latency old latency new throughput old throughput
sqlite 💿 string indexed 1000 10 5.6±0.02µs 5.6±0.01µs 174.0 Ktx/sec 175.7 Ktx/sec
sqlite 💿 string non_indexed 1000 10 49.5±0.15µs 50.7±0.27µs 19.7 Ktx/sec 19.2 Ktx/sec
sqlite 💿 u64 indexed 1000 10 5.4±0.01µs 5.3±0.02µs 180.0 Ktx/sec 182.6 Ktx/sec
sqlite 💿 u64 non_indexed 1000 10 33.2±0.31µs 33.0±0.06µs 29.4 Ktx/sec 29.6 Ktx/sec
sqlite 🧠 string indexed 1000 10 4.3±0.02µs 4.1±0.01µs 229.3 Ktx/sec 235.9 Ktx/sec
sqlite 🧠 string non_indexed 1000 10 48.8±0.34µs 49.6±0.29µs 20.0 Ktx/sec 19.7 Ktx/sec
sqlite 🧠 u64 indexed 1000 10 4.1±0.02µs 4.0±0.01µs 240.8 Ktx/sec 245.4 Ktx/sec
sqlite 🧠 u64 non_indexed 1000 10 31.7±0.14µs 31.8±0.06µs 30.8 Ktx/sec 30.7 Ktx/sec
stdb_module 💿 string indexed 1000 10 35.6±2.77µs 36.6±2.67µs 27.4 Ktx/sec 26.7 Ktx/sec
stdb_module 💿 string non_indexed 1000 10 179.7±0.46µs 167.7±2.11µs 5.4 Ktx/sec 5.8 Ktx/sec
stdb_module 💿 u64 indexed 1000 10 33.9±2.14µs 33.7±1.98µs 28.8 Ktx/sec 29.0 Ktx/sec
stdb_module 💿 u64 non_indexed 1000 10 146.4±14.05µs 141.7±4.10µs 6.7 Ktx/sec 6.9 Ktx/sec
stdb_module 🧠 string indexed 1000 10 36.4±3.08µs 37.2±3.25µs 26.8 Ktx/sec 26.2 Ktx/sec
stdb_module 🧠 string non_indexed 1000 10 163.3±0.88µs 170.6±5.86µs 6.0 Ktx/sec 5.7 Ktx/sec
stdb_module 🧠 u64 indexed 1000 10 32.8±2.82µs 32.4±3.34µs 29.8 Ktx/sec 30.1 Ktx/sec
stdb_module 🧠 u64 non_indexed 1000 10 141.1±10.56µs 141.8±4.22µs 6.9 Ktx/sec 6.9 Ktx/sec
stdb_raw 💿 string indexed 1000 10 4.5±0.02µs 4.5±0.01µs 219.2 Ktx/sec 217.4 Ktx/sec
stdb_raw 💿 string non_indexed 1000 10 141.5±0.22µs 146.9±0.42µs 6.9 Ktx/sec 6.6 Ktx/sec
stdb_raw 💿 u64 indexed 1000 10 4.3±0.02µs 4.3±0.01µs 224.6 Ktx/sec 226.7 Ktx/sec
stdb_raw 💿 u64 non_indexed 1000 10 122.3±0.15µs 126.3±0.18µs 8.0 Ktx/sec 7.7 Ktx/sec
stdb_raw 🧠 string indexed 1000 10 4.4±0.01µs 4.5±0.01µs 219.7 Ktx/sec 218.8 Ktx/sec
stdb_raw 🧠 string non_indexed 1000 10 138.9±0.38µs 143.8±0.36µs 7.0 Ktx/sec 6.8 Ktx/sec
stdb_raw 🧠 u64 indexed 1000 10 4.3±0.01µs 4.3±0.01µs 225.1 Ktx/sec 227.2 Ktx/sec
stdb_raw 🧠 u64 non_indexed 1000 10 121.3±0.16µs 125.2±0.56µs 8.1 Ktx/sec 7.8 Ktx/sec

Serialize

schema format count new latency old latency new throughput old throughput
location bsatn 100 1811.2±31.84ns 1677.7±27.34ns 52.7 Mtx/sec 56.8 Mtx/sec
location json 100 3.2±0.04µs 3.4±0.03µs 29.5 Mtx/sec 27.8 Mtx/sec
location product_value 100 552.6±0.39ns 549.8±0.75ns 172.6 Mtx/sec 173.4 Mtx/sec
person bsatn 100 2.5±0.01µs 3.2±0.01µs 38.3 Mtx/sec 29.9 Mtx/sec
person json 100 5.1±0.02µs 5.1±0.03µs 18.9 Mtx/sec 18.7 Mtx/sec
person product_value 100 1006.6±1.16ns 1004.1±0.78ns 94.7 Mtx/sec 95.0 Mtx/sec

Module: invoke with large arguments

arg size new latency old latency new throughput old throughput
64KiB 80.2±6.27µs 82.1±6.49µs - -

Module: print bulk

line count new latency old latency new throughput old throughput
1 24.4±2.17µs 23.5±1.48µs - -
100 204.5±5.01µs 202.5±4.09µs - -
1000 2.0±1.04ms 1875.0±65.00µs - -

Remaining benchmarks

name new latency old latency new throughput old throughput

Please sign in to comment.