Skip to content

Commit

Permalink
lib: Provide Arbitrary impls for Hash and DataKey
Browse files Browse the repository at this point in the history
Allows to remove custom strategies for the commit log types (in core),
and may become useful for future property testing efforts.
  • Loading branch information
kim committed Nov 6, 2023
1 parent 9a263b0 commit 0a4c2f1
Show file tree
Hide file tree
Showing 7 changed files with 29 additions and 28 deletions.
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions crates/core/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,8 @@ odb_sled = []
default = ["odb_sled"]

[dev-dependencies]
spacetimedb-lib = { path = "../lib", features = ["proptest"] }

rusqlite.workspace = true
criterion.workspace = true
proptest.workspace = true
Expand Down
8 changes: 0 additions & 8 deletions crates/core/src/db/messages/commit.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ use proptest_derive::Arbitrary;
pub struct Commit {
/// The [`Hash`] over the encoded bytes of the previous commit, or `None` if
/// it is the very first commit.
#[cfg_attr(test, proptest(strategy = "arbitrary::parent_commit_hash()"))]
pub parent_commit_hash: Option<Hash>,
/// Counter of all commits in a log.
pub commit_offset: u64,
Expand All @@ -39,13 +38,6 @@ pub struct Commit {
#[cfg(test)]
mod arbitrary {
use super::*;

// [`Hash`] is defined in `lib`, so we can't have an [`Arbitrary`] impl for
// it just yet due to orphan rules.
pub fn parent_commit_hash() -> impl Strategy<Value = Option<Hash>> {
any::<Option<[u8; 32]>>().prop_map(|maybe_hash| maybe_hash.map(|data| Hash { data }))
}

// Custom strategy to apply an upper bound on the number of [`Transaction`]s
// generated.
//
Expand Down
20 changes: 0 additions & 20 deletions crates/core/src/db/messages/write.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@ use anyhow::Context as _;
pub use spacetimedb_lib::DataKey;
use spacetimedb_sats::buffer::{BufReader, BufWriter, DecodeError};

#[cfg(test)]
use proptest::prelude::*;
#[cfg(test)]
use proptest_derive::Arbitrary;

Expand All @@ -21,27 +19,9 @@ use proptest_derive::Arbitrary;
pub struct Write {
pub operation: Operation,
pub set_id: u32, // aka table id
#[cfg_attr(test, proptest(strategy = "arbitrary::datakey()"))]
pub data_key: DataKey,
}

#[cfg(test)]
mod arbitrary {
use super::*;

// [`DataKey`] is defined in `lib`, so we can't have an [`Arbitrary`] impl
// for it just yet due to orphan rules.
pub fn datakey() -> impl Strategy<Value = DataKey> {
// Create [`DataKey::Inline`] and [`DataKey::Hash`] with the same
// probability. [`DataKey::from_data`] will take care of choosing the
// variant based in the input length.
prop_oneof![
prop::collection::vec(any::<u8>(), 0..31).prop_map(DataKey::from_data),
prop::collection::vec(any::<u8>(), 31..255).prop_map(DataKey::from_data)
]
}
}

/// The operation of a [`Write`], either insert or delete.
///
/// Encoded as a single byte with bits:
Expand Down
9 changes: 9 additions & 0 deletions crates/lib/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ required-features = ["serde"]
default = ["serde"]
serde = ["dep:serde", "spacetimedb-sats/serde", "dep:serde_with", "chrono/serde"]
cli = ["clap"]
# Allows using `Arbitrary` impls defined in this crate.
proptest = ["dep:proptest", "dep:proptest-derive"]

[dependencies]
spacetimedb-bindings-macro = { path = "../bindings-macro", version = "0.7.2" }
Expand All @@ -37,9 +39,16 @@ sha3.workspace = true
thiserror.workspace = true
tracing.workspace = true

# For the 'proptest' feature.
proptest = { workspace = true, optional = true }
proptest-derive = { workspace = true, optional = true }

[dev-dependencies]
rand.workspace = true
bytes.workspace = true
serde_json.workspace = true
insta.workspace = true

# Also as dev-dependencies for use in _this_ crate's tests.
proptest.workspace = true
proptest-derive.workspace = true
16 changes: 16 additions & 0 deletions crates/lib/src/data_key.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,13 @@ use std::ops::Deref;
use crate::buffer::{BufReader, BufWriter, DecodeError};
use crate::hash::hash_bytes;

#[cfg(any(test, feature = "proptest"))]
use proptest::prelude::*;
#[cfg(any(test, feature = "proptest"))]
use proptest_derive::Arbitrary;

#[derive(Debug, Copy, Clone, PartialEq, Ord, PartialOrd, Eq, Hash)]
#[cfg_attr(any(test, feature = "proptest"), derive(Arbitrary))]
pub enum DataKey {
Data(InlineData),
Hash(super::Hash),
Expand Down Expand Up @@ -78,6 +84,16 @@ impl fmt::Debug for InlineData {
}
}

#[cfg(any(test, feature = "proptest"))]
impl Arbitrary for InlineData {
type Parameters = ();
type Strategy = prop::strategy::Map<prop::collection::VecStrategy<prop::num::u8::Any>, fn(Vec<u8>) -> InlineData>;

fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy {
prop::collection::vec(any::<u8>(), 0..MAX_INLINE).prop_map(|bytes| InlineData::from_bytes(&bytes).unwrap())
}
}

const IS_HASH_BIT: u8 = 0b1000_0000;

// <flags(1)><value(0-32)>
Expand Down
1 change: 1 addition & 0 deletions crates/lib/src/hash.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ use crate::hex::HexString;
pub const HASH_SIZE: usize = 32;

#[derive(Eq, PartialEq, PartialOrd, Ord, Clone, Copy, Hash)]
#[cfg_attr(any(test, feature = "proptest"), derive(proptest_derive::Arbitrary))]
pub struct Hash {
pub data: [u8; HASH_SIZE],
}
Expand Down

1 comment on commit 0a4c2f1

@github-actions
Copy link

@github-actions github-actions bot commented on 0a4c2f1 Nov 6, 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 💿 424.9±1.31ns 429.2±1.77ns - -
sqlite 🧠 420.9±1.16ns 422.1±1.31ns - -
stdb_module 💿 17.0±0.37µs 18.1±1.40µs - -
stdb_module 🧠 17.3±0.91µs 18.4±1.26µs - -
stdb_raw 💿 722.2±5.07ns 721.1±1.05ns - -
stdb_raw 🧠 716.2±1.12ns 714.2±1.25ns - -

Single-row insertions

db on disk schema index type load new latency old latency new throughput old throughput
sqlite 💿 location multi_index 0 14.8±1.76µs 15.0±1.75µs 65.8 Ktx/sec 65.0 Ktx/sec
sqlite 💿 location multi_index 1000 15.7±0.13µs 16.0±0.12µs 62.1 Ktx/sec 61.2 Ktx/sec
sqlite 💿 location non_unique 0 7.1±0.57µs 7.4±2.34µs 138.0 Ktx/sec 131.1 Ktx/sec
sqlite 💿 location non_unique 1000 6.9±0.04µs 7.1±0.04µs 141.4 Ktx/sec 138.2 Ktx/sec
sqlite 💿 location unique 0 7.1±1.20µs 7.3±0.88µs 137.2 Ktx/sec 134.2 Ktx/sec
sqlite 💿 location unique 1000 6.9±0.03µs 7.1±0.04µs 141.3 Ktx/sec 137.8 Ktx/sec
sqlite 💿 person multi_index 0 14.3±0.29µs 14.5±0.03µs 68.4 Ktx/sec 67.5 Ktx/sec
sqlite 💿 person multi_index 1000 16.2±0.16µs 16.1±0.11µs 60.3 Ktx/sec 60.5 Ktx/sec
sqlite 💿 person non_unique 0 7.2±0.40µs 7.3±0.31µs 135.9 Ktx/sec 133.5 Ktx/sec
sqlite 💿 person non_unique 1000 7.3±0.07µs 7.3±0.04µs 134.3 Ktx/sec 134.1 Ktx/sec
sqlite 💿 person unique 0 7.2±0.49µs 7.3±0.27µs 136.1 Ktx/sec 133.5 Ktx/sec
sqlite 💿 person unique 1000 7.3±0.15µs 7.3±0.04µs 134.3 Ktx/sec 133.2 Ktx/sec
sqlite 🧠 location multi_index 0 4.0±0.01µs 4.0±0.01µs 243.5 Ktx/sec 245.5 Ktx/sec
sqlite 🧠 location multi_index 1000 5.3±0.04µs 5.2±0.05µs 185.7 Ktx/sec 187.3 Ktx/sec
sqlite 🧠 location non_unique 0 1844.5±3.16ns 1869.4±5.32ns 529.4 Ktx/sec 522.4 Ktx/sec
sqlite 🧠 location non_unique 1000 1859.3±32.62ns 1903.5±9.40ns 525.2 Ktx/sec 513.0 Ktx/sec
sqlite 🧠 location unique 0 1816.0±5.37ns 1835.2±5.18ns 537.8 Ktx/sec 532.1 Ktx/sec
sqlite 🧠 location unique 1000 1915.6±16.80ns 1933.9±12.95ns 509.8 Ktx/sec 505.0 Ktx/sec
sqlite 🧠 person multi_index 0 3.6±0.01µs 3.6±0.01µs 268.4 Ktx/sec 269.4 Ktx/sec
sqlite 🧠 person multi_index 1000 5.5±0.03µs 5.4±0.04µs 177.3 Ktx/sec 180.5 Ktx/sec
sqlite 🧠 person non_unique 0 1908.1±3.42ns 1933.6±6.35ns 511.8 Ktx/sec 505.1 Ktx/sec
sqlite 🧠 person non_unique 1000 1990.8±22.33ns 1997.7±9.39ns 490.5 Ktx/sec 488.9 Ktx/sec
sqlite 🧠 person unique 0 1893.0±3.55ns 1930.1±5.63ns 515.9 Ktx/sec 506.0 Ktx/sec
sqlite 🧠 person unique 1000 2.0±0.01µs 2.0±0.01µs 479.4 Ktx/sec 477.1 Ktx/sec
stdb_module 💿 location multi_index 0 54.7±5.52µs 52.6±5.07µs 17.9 Ktx/sec 18.6 Ktx/sec
stdb_module 💿 location multi_index 1000 161.5±7.36µs 177.3±105.72µs 6.0 Ktx/sec 5.5 Ktx/sec
stdb_module 💿 location non_unique 0 46.3±3.56µs 45.2±4.10µs 21.1 Ktx/sec 21.6 Ktx/sec
stdb_module 💿 location non_unique 1000 241.4±84.90µs 118.9±28.34µs 4.0 Ktx/sec 8.2 Ktx/sec
stdb_module 💿 location unique 0 48.9±5.89µs 51.3±6.27µs 20.0 Ktx/sec 19.0 Ktx/sec
stdb_module 💿 location unique 1000 101.5±5.00µs 136.8±9.92µs 9.6 Ktx/sec 7.1 Ktx/sec
stdb_module 💿 person multi_index 0 63.2±5.44µs 64.8±6.74µs 15.4 Ktx/sec 15.1 Ktx/sec
stdb_module 💿 person multi_index 1000 221.3±29.70µs 178.2±14.55µs 4.4 Ktx/sec 5.5 Ktx/sec
stdb_module 💿 person non_unique 0 46.8±5.01µs 47.1±4.98µs 20.9 Ktx/sec 20.7 Ktx/sec
stdb_module 💿 person non_unique 1000 156.9±38.21µs 182.0±14.30µs 6.2 Ktx/sec 5.4 Ktx/sec
stdb_module 💿 person unique 0 56.9±6.75µs 59.0±5.76µs 17.1 Ktx/sec 16.5 Ktx/sec
stdb_module 💿 person unique 1000 188.3±93.65µs 274.5±59.07µs 5.2 Ktx/sec 3.6 Ktx/sec
stdb_module 🧠 location multi_index 0 36.3±4.13µs 39.0±3.34µs 26.9 Ktx/sec 25.0 Ktx/sec
stdb_module 🧠 location multi_index 1000 110.9±4.77µs 158.3±21.67µs 8.8 Ktx/sec 6.2 Ktx/sec
stdb_module 🧠 location non_unique 0 32.0±3.45µs 30.3±2.16µs 30.5 Ktx/sec 32.2 Ktx/sec
stdb_module 🧠 location non_unique 1000 162.2±13.00µs 162.9±4.16µs 6.0 Ktx/sec 6.0 Ktx/sec
stdb_module 🧠 location unique 0 34.5±3.75µs 34.4±2.49µs 28.3 Ktx/sec 28.4 Ktx/sec
stdb_module 🧠 location unique 1000 166.9±45.22µs 193.1±8.16µs 5.9 Ktx/sec 5.1 Ktx/sec
stdb_module 🧠 person multi_index 0 47.1±4.59µs 49.0±4.46µs 20.7 Ktx/sec 19.9 Ktx/sec
stdb_module 🧠 person multi_index 1000 249.1±69.91µs 306.4±11.10µs 3.9 Ktx/sec 3.2 Ktx/sec
stdb_module 🧠 person non_unique 0 34.2±2.49µs 32.3±2.73µs 28.5 Ktx/sec 30.2 Ktx/sec
stdb_module 🧠 person non_unique 1000 252.3±11.44µs 252.5±4.96µs 3.9 Ktx/sec 3.9 Ktx/sec
stdb_module 🧠 person unique 0 39.7±3.31µs 38.7±3.19µs 24.6 Ktx/sec 25.3 Ktx/sec
stdb_module 🧠 person unique 1000 106.5±6.98µs 202.1±2.22µs 9.2 Ktx/sec 4.8 Ktx/sec
stdb_raw 💿 location multi_index 0 7.0±0.03µs 7.1±0.02µs 138.6 Ktx/sec 137.3 Ktx/sec
stdb_raw 💿 location multi_index 1000 34.8±249.40µs 33.2±233.19µs 28.1 Ktx/sec 29.4 Ktx/sec
stdb_raw 💿 location non_unique 0 4.7±0.01µs 4.7±0.02µs 209.1 Ktx/sec 208.3 Ktx/sec
stdb_raw 💿 location non_unique 1000 6.2±0.17µs 6.1±0.19µs 158.2 Ktx/sec 160.2 Ktx/sec
stdb_raw 💿 location unique 0 6.0±0.01µs 6.4±0.18µs 164.0 Ktx/sec 151.6 Ktx/sec
stdb_raw 💿 location unique 1000 22.9±145.44µs 24.8±163.99µs 42.7 Ktx/sec 39.3 Ktx/sec
stdb_raw 💿 person multi_index 0 10.8±0.86µs 10.8±0.03µs 90.5 Ktx/sec 90.5 Ktx/sec
stdb_raw 💿 person multi_index 1000 14.1±0.18µs 85.6±501.60µs 69.3 Ktx/sec 11.4 Ktx/sec
stdb_raw 💿 person non_unique 0 5.2±0.31µs 5.3±0.04µs 187.1 Ktx/sec 185.8 Ktx/sec
stdb_raw 💿 person non_unique 1000 24.1±171.18µs 7.0±0.21µs 40.5 Ktx/sec 140.1 Ktx/sec
stdb_raw 💿 person unique 0 7.6±0.40µs 7.7±0.03µs 128.2 Ktx/sec 126.2 Ktx/sec
stdb_raw 💿 person unique 1000 10.3±0.22µs 33.9±235.51µs 94.9 Ktx/sec 28.8 Ktx/sec
stdb_raw 🧠 location multi_index 0 4.1±0.01µs 4.2±0.01µs 235.5 Ktx/sec 230.1 Ktx/sec
stdb_raw 🧠 location multi_index 1000 5.8±0.11µs 5.8±0.05µs 168.9 Ktx/sec 167.9 Ktx/sec
stdb_raw 🧠 location non_unique 0 1938.0±5.58ns 1943.0±5.89ns 503.9 Ktx/sec 502.6 Ktx/sec
stdb_raw 🧠 location non_unique 1000 2.4±0.02µs 2.4±0.02µs 402.5 Ktx/sec 402.1 Ktx/sec
stdb_raw 🧠 location unique 0 3.2±0.00µs 3.2±0.01µs 306.0 Ktx/sec 301.3 Ktx/sec
stdb_raw 🧠 location unique 1000 4.4±0.06µs 4.5±0.04µs 220.8 Ktx/sec 217.3 Ktx/sec
stdb_raw 🧠 person multi_index 0 7.8±0.01µs 7.9±0.01µs 125.1 Ktx/sec 123.8 Ktx/sec
stdb_raw 🧠 person multi_index 1000 9.9±0.07µs 10.0±0.09µs 99.0 Ktx/sec 97.8 Ktx/sec
stdb_raw 🧠 person non_unique 0 2.5±0.00µs 2.5±0.01µs 397.2 Ktx/sec 392.9 Ktx/sec
stdb_raw 🧠 person non_unique 1000 3.2±0.02µs 3.2±0.02µs 301.4 Ktx/sec 304.1 Ktx/sec
stdb_raw 🧠 person unique 0 4.7±0.01µs 4.9±0.01µs 207.7 Ktx/sec 201.0 Ktx/sec
stdb_raw 🧠 person unique 1000 6.2±0.05µs 6.4±0.04µs 157.0 Ktx/sec 152.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 129.9±3.59µs 131.3±2.43µs 7.5 Ktx/sec 7.4 Ktx/sec
sqlite 💿 location multi_index 1000 100 202.0±1.37µs 202.6±1.12µs 4.8 Ktx/sec 4.8 Ktx/sec
sqlite 💿 location non_unique 0 100 49.8±1.04µs 50.3±1.23µs 19.6 Ktx/sec 19.4 Ktx/sec
sqlite 💿 location non_unique 1000 100 53.6±0.32µs 53.9±0.58µs 18.2 Ktx/sec 18.1 Ktx/sec
sqlite 💿 location unique 0 100 52.1±1.47µs 52.3±0.43µs 18.8 Ktx/sec 18.7 Ktx/sec
sqlite 💿 location unique 1000 100 57.7±2.19µs 57.9±10.34µs 16.9 Ktx/sec 16.9 Ktx/sec
sqlite 💿 person multi_index 0 100 116.1±0.25µs 118.6±8.47µs 8.4 Ktx/sec 8.2 Ktx/sec
sqlite 💿 person multi_index 1000 100 230.8±0.44µs 231.8±0.56µs 4.2 Ktx/sec 4.2 Ktx/sec
sqlite 💿 person non_unique 0 100 46.6±1.29µs 48.8±1.70µs 20.9 Ktx/sec 20.0 Ktx/sec
sqlite 💿 person non_unique 1000 100 60.7±0.25µs 60.7±0.26µs 16.1 Ktx/sec 16.1 Ktx/sec
sqlite 💿 person unique 0 100 50.9±5.15µs 51.4±1.75µs 19.2 Ktx/sec 19.0 Ktx/sec
sqlite 💿 person unique 1000 100 57.2±0.34µs 57.0±0.22µs 17.1 Ktx/sec 17.1 Ktx/sec
sqlite 🧠 location multi_index 0 100 118.5±0.42µs 118.7±0.37µs 8.2 Ktx/sec 8.2 Ktx/sec
sqlite 🧠 location multi_index 1000 100 169.3±0.34µs 170.5±0.51µs 5.8 Ktx/sec 5.7 Ktx/sec
sqlite 🧠 location non_unique 0 100 42.6±0.41µs 43.8±0.25µs 22.9 Ktx/sec 22.3 Ktx/sec
sqlite 🧠 location non_unique 1000 100 44.6±0.37µs 44.6±0.40µs 21.9 Ktx/sec 21.9 Ktx/sec
sqlite 🧠 location unique 0 100 44.9±0.43µs 44.7±0.24µs 21.8 Ktx/sec 21.9 Ktx/sec
sqlite 🧠 location unique 1000 100 48.2±0.25µs 48.4±0.34µs 20.2 Ktx/sec 20.2 Ktx/sec
sqlite 🧠 person multi_index 0 100 104.8±0.24µs 106.1±0.31µs 9.3 Ktx/sec 9.2 Ktx/sec
sqlite 🧠 person multi_index 1000 100 187.4±0.32µs 188.3±0.42µs 5.2 Ktx/sec 5.2 Ktx/sec
sqlite 🧠 person non_unique 0 100 41.2±0.33µs 41.9±0.31µs 23.7 Ktx/sec 23.3 Ktx/sec
sqlite 🧠 person non_unique 1000 100 45.1±0.29µs 45.9±0.40µs 21.7 Ktx/sec 21.3 Ktx/sec
sqlite 🧠 person unique 0 100 43.8±0.36µs 43.9±0.33µs 22.3 Ktx/sec 22.2 Ktx/sec
sqlite 🧠 person unique 1000 100 47.9±0.45µs 48.2±0.37µs 20.4 Ktx/sec 20.3 Ktx/sec
stdb_module 💿 location multi_index 0 100 799.0±165.77µs 710.7±74.48µs 1251 tx/sec 1407 tx/sec
stdb_module 💿 location multi_index 1000 100 1254.6±78.03µs 830.9±162.16µs 797 tx/sec 1203 tx/sec
stdb_module 💿 location non_unique 0 100 515.8±99.00µs 436.0±49.72µs 1938 tx/sec 2.2 Ktx/sec
stdb_module 💿 location non_unique 1000 100 591.0±38.41µs 583.9±54.53µs 1692 tx/sec 1712 tx/sec
stdb_module 💿 location unique 0 100 805.2±136.62µs 667.8±137.14µs 1241 tx/sec 1497 tx/sec
stdb_module 💿 location unique 1000 100 618.3±73.16µs 670.8±63.93µs 1617 tx/sec 1490 tx/sec
stdb_module 💿 person multi_index 0 100 1026.1±100.33µs 996.7±7.06µs 974 tx/sec 1003 tx/sec
stdb_module 💿 person multi_index 1000 100 1242.7±21.12µs 1144.8±39.87µs 804 tx/sec 873 tx/sec
stdb_module 💿 person non_unique 0 100 589.7±106.27µs 553.3±118.21µs 1695 tx/sec 1807 tx/sec
stdb_module 💿 person non_unique 1000 100 1019.3±12.02µs 781.1±56.48µs 981 tx/sec 1280 tx/sec
stdb_module 💿 person unique 0 100 747.7±26.67µs 766.4±4.77µs 1337 tx/sec 1304 tx/sec
stdb_module 💿 person unique 1000 100 814.0±38.56µs 891.0±80.08µs 1228 tx/sec 1122 tx/sec
stdb_module 🧠 location multi_index 0 100 608.6±119.05µs 803.5±4.13µs 1643 tx/sec 1244 tx/sec
stdb_module 🧠 location multi_index 1000 100 888.3±28.01µs 675.0±148.13µs 1125 tx/sec 1481 tx/sec
stdb_module 🧠 location non_unique 0 100 375.0±23.12µs 354.1±57.13µs 2.6 Ktx/sec 2.8 Ktx/sec
stdb_module 🧠 location non_unique 1000 100 390.4±6.82µs 440.3±30.93µs 2.5 Ktx/sec 2.2 Ktx/sec
stdb_module 🧠 location unique 0 100 476.9±91.10µs 438.3±6.63µs 2.0 Ktx/sec 2.2 Ktx/sec
stdb_module 🧠 location unique 1000 100 591.3±10.43µs 506.2±8.02µs 1691 tx/sec 1975 tx/sec
stdb_module 🧠 person multi_index 0 100 818.5±18.80µs 813.6±10.78µs 1221 tx/sec 1229 tx/sec
stdb_module 🧠 person multi_index 1000 100 1146.6±9.74µs 900.4±37.30µs 872 tx/sec 1110 tx/sec
stdb_module 🧠 person non_unique 0 100 389.7±18.95µs 404.4±12.72µs 2.5 Ktx/sec 2.4 Ktx/sec
stdb_module 🧠 person non_unique 1000 100 407.3±67.41µs 476.4±141.52µs 2.4 Ktx/sec 2.0 Ktx/sec
stdb_module 🧠 person unique 0 100 638.5±10.59µs 598.8±1.12µs 1566 tx/sec 1669 tx/sec
stdb_module 🧠 person unique 1000 100 825.4±22.19µs 802.1±62.14µs 1211 tx/sec 1246 tx/sec
stdb_raw 💿 location multi_index 0 100 384.1±1.84µs 388.1±25.26µs 2.5 Ktx/sec 2.5 Ktx/sec
stdb_raw 💿 location multi_index 1000 100 430.2±208.10µs 432.2±232.75µs 2.3 Ktx/sec 2.3 Ktx/sec
stdb_raw 💿 location non_unique 0 100 157.0±0.50µs 157.7±6.42µs 6.2 Ktx/sec 6.2 Ktx/sec
stdb_raw 💿 location non_unique 1000 100 171.3±112.71µs 159.2±0.95µs 5.7 Ktx/sec 6.1 Ktx/sec
stdb_raw 💿 location unique 0 100 280.2±0.36µs 286.6±1.00µs 3.5 Ktx/sec 3.4 Ktx/sec
stdb_raw 💿 location unique 1000 100 299.0±1.15µs 320.0±140.40µs 3.3 Ktx/sec 3.1 Ktx/sec
stdb_raw 💿 person multi_index 0 100 706.5±0.75µs 717.1±13.24µs 1415 tx/sec 1394 tx/sec
stdb_raw 💿 person multi_index 1000 100 736.1±3.10µs 743.1±2.48µs 1358 tx/sec 1345 tx/sec
stdb_raw 💿 person non_unique 0 100 214.5±0.17µs 218.5±38.46µs 4.6 Ktx/sec 4.5 Ktx/sec
stdb_raw 💿 person non_unique 1000 100 232.4±153.59µs 218.0±1.19µs 4.2 Ktx/sec 4.5 Ktx/sec
stdb_raw 💿 person unique 0 100 423.5±0.97µs 433.3±1.68µs 2.3 Ktx/sec 2.3 Ktx/sec
stdb_raw 💿 person unique 1000 100 442.6±1.13µs 465.0±151.38µs 2.2 Ktx/sec 2.1 Ktx/sec
stdb_raw 🧠 location multi_index 0 100 301.6±0.43µs 302.8±0.63µs 3.2 Ktx/sec 3.2 Ktx/sec
stdb_raw 🧠 location multi_index 1000 100 324.4±0.79µs 325.4±0.54µs 3.0 Ktx/sec 3.0 Ktx/sec
stdb_raw 🧠 location non_unique 0 100 75.1±0.12µs 74.8±0.73µs 13.0 Ktx/sec 13.1 Ktx/sec
stdb_raw 🧠 location non_unique 1000 100 76.4±0.10µs 76.6±0.23µs 12.8 Ktx/sec 12.8 Ktx/sec
stdb_raw 🧠 location unique 0 100 196.8±0.23µs 204.1±0.38µs 5.0 Ktx/sec 4.8 Ktx/sec
stdb_raw 🧠 location unique 1000 100 215.8±0.94µs 222.6±0.31µs 4.5 Ktx/sec 4.4 Ktx/sec
stdb_raw 🧠 person multi_index 0 100 617.6±0.43µs 625.8±0.36µs 1619 tx/sec 1597 tx/sec
stdb_raw 🧠 person multi_index 1000 100 645.9±1.12µs 654.0±0.51µs 1548 tx/sec 1529 tx/sec
stdb_raw 🧠 person non_unique 0 100 127.4±0.19µs 127.2±0.13µs 7.7 Ktx/sec 7.7 Ktx/sec
stdb_raw 🧠 person non_unique 1000 100 130.0±0.20µs 129.9±0.23µs 7.5 Ktx/sec 7.5 Ktx/sec
stdb_raw 🧠 person unique 0 100 336.3±0.35µs 343.1±0.39µs 2.9 Ktx/sec 2.8 Ktx/sec
stdb_raw 🧠 person unique 1000 100 355.3±0.72µs 362.2±0.86µs 2.7 Ktx/sec 2.7 Ktx/sec

Full table iterate

db on disk schema index type new latency old latency new throughput old throughput
sqlite 💿 location unique 8.8±0.09µs 9.0±0.07µs 111.6 Ktx/sec 108.9 Ktx/sec
sqlite 💿 person unique 9.3±0.12µs 9.5±0.14µs 104.9 Ktx/sec 103.1 Ktx/sec
sqlite 🧠 location unique 7.6±0.08µs 7.7±0.10µs 129.2 Ktx/sec 126.5 Ktx/sec
sqlite 🧠 person unique 8.2±0.14µs 8.2±0.10µs 119.8 Ktx/sec 119.0 Ktx/sec
stdb_module 💿 location unique 47.4±5.56µs 45.1±5.58µs 20.6 Ktx/sec 21.7 Ktx/sec
stdb_module 💿 person unique 59.5±11.02µs 60.0±9.53µs 16.4 Ktx/sec 16.3 Ktx/sec
stdb_module 🧠 location unique 49.1±3.94µs 47.4±4.87µs 19.9 Ktx/sec 20.6 Ktx/sec
stdb_module 🧠 person unique 62.4±9.23µs 51.2±9.53µs 15.6 Ktx/sec 19.1 Ktx/sec
stdb_raw 💿 location unique 9.0±0.02µs 9.0±0.02µs 107.9 Ktx/sec 108.0 Ktx/sec
stdb_raw 💿 person unique 9.0±0.03µs 9.0±0.01µs 107.9 Ktx/sec 108.1 Ktx/sec
stdb_raw 🧠 location unique 9.1±0.03µs 9.0±0.01µs 107.9 Ktx/sec 108.2 Ktx/sec
stdb_raw 🧠 person unique 9.0±0.03µs 9.0±0.02µs 107.9 Ktx/sec 108.2 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.4±0.01µs 423.0 Ktx/sec 413.7 Ktx/sec
sqlite 🧠 u32 1000 1127.1±4.98ns 1145.4±4.16ns 866.4 Ktx/sec 852.6 Ktx/sec
stdb_module 💿 u32 1000 24.4±1.64µs 25.2±2.66µs 40.1 Ktx/sec 38.8 Ktx/sec
stdb_module 🧠 u32 1000 24.6±2.00µs 25.1±1.74µs 39.6 Ktx/sec 38.9 Ktx/sec
stdb_raw 💿 u32 1000 1936.7±2.50ns 1937.7±19.77ns 504.2 Ktx/sec 504.0 Ktx/sec
stdb_raw 🧠 u32 1000 1923.6±16.02ns 1920.5±6.03ns 507.7 Ktx/sec 508.5 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.7±0.02µs 5.8±0.02µs 172.3 Ktx/sec 169.5 Ktx/sec
sqlite 💿 string non_indexed 1000 10 52.2±0.84µs 52.0±0.46µs 18.7 Ktx/sec 18.8 Ktx/sec
sqlite 💿 u64 indexed 1000 10 5.4±0.05µs 5.5±0.02µs 179.9 Ktx/sec 178.4 Ktx/sec
sqlite 💿 u64 non_indexed 1000 10 33.0±0.15µs 32.9±0.08µs 29.6 Ktx/sec 29.7 Ktx/sec
sqlite 🧠 string indexed 1000 10 4.2±0.02µs 4.3±0.02µs 230.7 Ktx/sec 227.5 Ktx/sec
sqlite 🧠 string non_indexed 1000 10 50.6±0.56µs 49.9±0.71µs 19.3 Ktx/sec 19.6 Ktx/sec
sqlite 🧠 u64 indexed 1000 10 4.0±0.02µs 4.1±0.01µs 244.1 Ktx/sec 239.1 Ktx/sec
sqlite 🧠 u64 non_indexed 1000 10 32.0±0.14µs 31.5±0.09µs 30.5 Ktx/sec 31.0 Ktx/sec
stdb_module 💿 string indexed 1000 10 36.2±2.68µs 36.5±2.14µs 27.0 Ktx/sec 26.7 Ktx/sec
stdb_module 💿 string non_indexed 1000 10 168.5±1.61µs 176.1±6.86µs 5.8 Ktx/sec 5.5 Ktx/sec
stdb_module 💿 u64 indexed 1000 10 33.5±3.02µs 34.0±2.22µs 29.2 Ktx/sec 28.7 Ktx/sec
stdb_module 💿 u64 non_indexed 1000 10 145.5±18.56µs 138.5±1.27µs 6.7 Ktx/sec 7.1 Ktx/sec
stdb_module 🧠 string indexed 1000 10 36.5±2.49µs 36.3±2.67µs 26.7 Ktx/sec 26.9 Ktx/sec
stdb_module 🧠 string non_indexed 1000 10 168.9±4.30µs 169.5±6.74µs 5.8 Ktx/sec 5.8 Ktx/sec
stdb_module 🧠 u64 indexed 1000 10 32.5±1.72µs 33.4±2.42µs 30.1 Ktx/sec 29.2 Ktx/sec
stdb_module 🧠 u64 non_indexed 1000 10 134.6±0.88µs 136.0±9.45µs 7.3 Ktx/sec 7.2 Ktx/sec
stdb_raw 💿 string indexed 1000 10 4.5±0.01µs 4.5±0.01µs 216.7 Ktx/sec 217.2 Ktx/sec
stdb_raw 💿 string non_indexed 1000 10 138.2±0.62µs 138.0±0.37µs 7.1 Ktx/sec 7.1 Ktx/sec
stdb_raw 💿 u64 indexed 1000 10 4.4±0.01µs 4.4±0.01µs 222.7 Ktx/sec 222.1 Ktx/sec
stdb_raw 💿 u64 non_indexed 1000 10 114.9±0.16µs 114.5±0.12µs 8.5 Ktx/sec 8.5 Ktx/sec
stdb_raw 🧠 string indexed 1000 10 4.5±0.01µs 4.5±0.01µs 217.3 Ktx/sec 217.4 Ktx/sec
stdb_raw 🧠 string non_indexed 1000 10 137.7±0.21µs 136.6±1.60µs 7.1 Ktx/sec 7.1 Ktx/sec
stdb_raw 🧠 u64 indexed 1000 10 4.4±0.01µs 4.4±0.01µs 223.9 Ktx/sec 223.0 Ktx/sec
stdb_raw 🧠 u64 non_indexed 1000 10 114.4±0.22µs 114.2±0.12µs 8.5 Ktx/sec 8.5 Ktx/sec

Serialize

schema format count new latency old latency new throughput old throughput
location bsatn 100 1855.2±40.47ns 1866.2±34.26ns 51.4 Mtx/sec 51.1 Mtx/sec
location json 100 3.3±0.03µs 3.2±0.01µs 28.8 Mtx/sec 30.3 Mtx/sec
location product_value 100 579.0±1.82ns 577.8±0.37ns 164.7 Mtx/sec 165.1 Mtx/sec
person bsatn 100 2.7±0.04µs 2.6±0.03µs 35.0 Mtx/sec 36.7 Mtx/sec
person json 100 4.9±0.03µs 4.8±0.04µs 19.5 Mtx/sec 20.0 Mtx/sec
person product_value 100 1005.8±1.18ns 1002.7±0.67ns 94.8 Mtx/sec 95.1 Mtx/sec

Module: invoke with large arguments

arg size new latency old latency new throughput old throughput
64KiB 76.5±13.34µs 79.1±5.31µs - -

Module: print bulk

line count new latency old latency new throughput old throughput
1 23.6±1.76µs 22.6±1.16µs - -
100 206.1±4.91µs 201.2±3.35µs - -
1000 2.1±1.15ms 1872.5±68.65µs - -

Remaining benchmarks

name new latency old latency new throughput old throughput

Please sign in to comment.