Skip to content

Commit

Permalink
Move ABI check to instantiation (#233)
Browse files Browse the repository at this point in the history
* Move ABI check to instantiation

This is a follow-up to #197.

This fixes an extra case I was worried about even with that fix but didn't hit it in my initial examples so hoped it's not worth the complexity.

Now I've hit it in a different module: because ABI can have zeroes - e.g. 3.0 is encoded as `\00\00\03\00` in the data segment - linker might place it in the beginning of a data segment, in which case `wasm-opt` will trim those prefix \00 bytes and there won't be any single data segment containing the entire version, and the ABI check will still fail.

It's possible to make the `determine_spacetime_abi` account for this case and merge chunks from different data segments when they overlap with version, but I feel it's growing to the point where it doesn't justify the complexity.

Instead, I'm moving the check into Wasmer's instantiation, since we construct a Wasm instance right away anyway, and it takes care of zero-filling and loading all the data segments into memory.

This makes the check more reliable and simpler, as well as avoids double-parsing of Wasm, but it does mean that we'll need to copy it to other hosts in the unlikely event we want to support 2 Wasm hosts simultaneously in the future.

IMO in this case the tradeoff is worth it.

* Add comment explanation

* Fixup conflict resolution

Signed-off-by: Ingvar Stepanyan <me@rreverser.com>

---------

Signed-off-by: Ingvar Stepanyan <me@rreverser.com>
Signed-off-by: Tyler Cloutier <cloutiertyler@users.noreply.github.com>
Co-authored-by: Tyler Cloutier <cloutiertyler@users.noreply.github.com>
  • Loading branch information
RReverser and cloutiertyler authored Oct 2, 2023
1 parent 4349370 commit 6325f75
Show file tree
Hide file tree
Showing 5 changed files with 55 additions and 126 deletions.
2 changes: 0 additions & 2 deletions crates/core/src/host/wasm_common.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
pub mod abi;
pub mod module_host_actor;

use crate::error::{DBError, IndexError, NodesError};
Expand Down Expand Up @@ -226,7 +225,6 @@ impl FuncNames {
#[error(transparent)]
pub enum ModuleCreationError {
WasmCompileError(anyhow::Error),
Abi(#[from] abi::AbiVersionError),
Init(#[from] module_host_actor::InitializationError),
}

Expand Down
110 changes: 0 additions & 110 deletions crates/core/src/host/wasm_common/abi.rs

This file was deleted.

14 changes: 13 additions & 1 deletion crates/core/src/host/wasm_common/module_host_actor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ use bytes::Bytes;
use nonempty::NonEmpty;
use spacetimedb_lib::buffer::DecodeError;
use spacetimedb_lib::identity::AuthCtx;
use spacetimedb_lib::{bsatn, Address, IndexType, ModuleDef};
use spacetimedb_lib::{bsatn, Address, IndexType, ModuleDef, VersionTuple};
use spacetimedb_vm::expr::CrudExpr;

use crate::client::ClientConnectionSender;
Expand Down Expand Up @@ -100,8 +100,20 @@ pub(crate) struct WasmModuleHostActor<T: WasmModule> {
energy_monitor: Arc<dyn EnergyMonitor>,
}

#[derive(thiserror::Error, Debug)]
pub enum AbiVersionError {
#[error("module doesn't indicate spacetime ABI version")]
NoVersion,
#[error("abi version is malformed somehow (out-of-bounds, etc)")]
Malformed,
#[error("abi version {got} is not supported (host implements {implement})")]
UnsupportedVersion { got: VersionTuple, implement: VersionTuple },
}

#[derive(thiserror::Error, Debug)]
pub enum InitializationError {
#[error(transparent)]
Abi(#[from] AbiVersionError),
#[error(transparent)]
Validation(#[from] ValidationError),
#[error("setup function returned an error: {0}")]
Expand Down
11 changes: 1 addition & 10 deletions crates/core/src/host/wasmer/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ mod wasmer_module;
use wasmer_module::WasmerModule;

use super::scheduler::Scheduler;
use super::wasm_common::{abi, module_host_actor::WasmModuleHostActor, ModuleCreationError};
use super::wasm_common::{module_host_actor::WasmModuleHostActor, ModuleCreationError};
use super::{EnergyMonitor, EnergyQuanta};

pub fn make_actor(
Expand Down Expand Up @@ -47,15 +47,6 @@ pub fn make_actor(

let module = Module::new(&engine, program_bytes).map_err(|e| ModuleCreationError::WasmCompileError(e.into()))?;

let abi = abi::determine_spacetime_abi(program_bytes)?;

if !WasmerModule::IMPLEMENTED_ABI.supports(abi) {
return Err(ModuleCreationError::Abi(abi::AbiVersionError::UnsupportedVersion {
implement: WasmerModule::IMPLEMENTED_ABI,
got: abi,
}));
}

let module = WasmerModule::new(module, engine);

WasmModuleHostActor::new(dbic, module_hash, module, scheduler, energy_monitor).map_err(Into::into)
Expand Down
44 changes: 41 additions & 3 deletions crates/core/src/host/wasmer/wasmer_module.rs
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
use super::wasm_instance_env::WasmInstanceEnv;
use super::Mem;
use crate::host::instance_env::InstanceEnv;
use crate::host::wasm_common::module_host_actor::{DescribeError, InitializationError};
use crate::host::wasm_common::module_host_actor::{AbiVersionError, DescribeError, InitializationError};
use crate::host::wasm_common::*;
use crate::host::{EnergyQuanta, Timestamp};
use bytes::Bytes;
use spacetimedb_lib::VersionTuple;
use wasmer::{
imports, AsStoreMut, Engine, ExternType, Function, FunctionEnv, Imports, Instance, Module, RuntimeError, Store,
TypedFunction,
TypedFunction, WasmPtr,
};
use wasmer_middlewares::metering as wasmer_metering;

Expand Down Expand Up @@ -45,7 +46,7 @@ impl WasmerModule {
WasmerModule { module, engine }
}

pub const IMPLEMENTED_ABI: abi::VersionTuple = abi::VersionTuple::new(4, 0);
pub const IMPLEMENTED_ABI: VersionTuple = VersionTuple::new(4, 0);

fn imports(&self, store: &mut Store, env: &FunctionEnv<WasmInstanceEnv>) -> Imports {
const _: () = assert!(WasmerModule::IMPLEMENTED_ABI.eq(spacetimedb_lib::MODULE_ABI_VERSION));
Expand Down Expand Up @@ -174,6 +175,43 @@ impl module_host_actor::WasmInstancePre for WasmerModule {
.map_err(|err| InitializationError::Instantiation(err.into()))?;

let mem = Mem::extract(&instance.exports).unwrap();

// We could (and did in the past) parse the ABI version manually before the instantiation,
// but it gets complicated in presence of wasm-opt optimisations which might split encoded
// versions like `[...other data...]\00\00\03\00[...other data...]` by zeroes
// into several segments, so there is no single data segment containing the entire version.
// Instead, it's more reliable to extract the version from an instantiated module
// when all the data segments are loaded into the flat memory at correct offsets.
let abi_version = instance
.exports
.get_global(STDB_ABI_SYM)
.map_err(|_| AbiVersionError::NoVersion)?;

let mut abi_version = match abi_version.get(&mut store) {
wasmer::Value::I32(x) => x as u32,
_ => return Err(AbiVersionError::Malformed.into()),
};

let abi_is_addr = instance.exports.get_global(STDB_ABI_IS_ADDR_SYM).is_ok();
if abi_is_addr {
abi_version = u32::from_le_bytes(
mem.read_bytes(&store, WasmPtr::new(abi_version), 4)
.ok()
.and_then(|bytes| bytes.try_into().ok())
.ok_or(AbiVersionError::Malformed)?,
);
}

let abi_version = VersionTuple::from_u32(abi_version);

if !WasmerModule::IMPLEMENTED_ABI.supports(abi_version) {
return Err(AbiVersionError::UnsupportedVersion {
implement: WasmerModule::IMPLEMENTED_ABI,
got: abi_version,
}
.into());
}

env.as_mut(&mut store).mem = Some(mem);

// Note: this budget is just for initializers
Expand Down

1 comment on commit 6325f75

@github-actions
Copy link

Choose a reason for hiding this comment

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

Benchmark for 6325f75

Click to view benchmark
Test Base PR %
serialize/location/bsatn/count=100 2.6±0.02µs 37.1 MElem/sec N/A N/A
serialize/location/json/count=100 3.6±0.04µs 26.6 MElem/sec N/A N/A
serialize/location/product_value/count=100 2.6±0.04µs 36.5 MElem/sec N/A N/A
serialize/person/bsatn/count=100 3.4±0.06µs 27.7 MElem/sec N/A N/A
serialize/person/json/count=100 5.4±0.04µs 17.8 MElem/sec N/A N/A
serialize/person/product_value/count=100 1783.7±29.07ns 53.5 MElem/sec N/A N/A
sqlite/disk/empty 423.2±4.92ns 426.6±3.33ns +0.80%
sqlite/disk/filter/string/indexed/load=1000/count=10 5.7±0.03µs 172.7 KElem/sec N/A N/A
sqlite/disk/filter/string/non_indexed/load=1000/count=10 57.4±0.25µs 17.0 KElem/sec N/A N/A
sqlite/disk/filter/u64/indexed/load=1000/count=10 5.4±0.07µs 181.3 KElem/sec N/A N/A
sqlite/disk/filter/u64/non_indexed/load=1000/count=10 39.7±0.48µs 24.6 KElem/sec N/A N/A
sqlite/disk/find_unique/u32/load=1000 2.2±0.01µs 438.6 KElem/sec N/A N/A
sqlite/disk/insert_1/location/multi_index/load=0 14.9±0.28µs 65.5 KElem/sec N/A N/A
sqlite/disk/insert_1/location/multi_index/load=1000 19.5±0.43µs 50.0 KElem/sec N/A N/A
sqlite/disk/insert_1/location/non_unique/load=0 7.4±0.10µs 131.8 KElem/sec N/A N/A
sqlite/disk/insert_1/location/non_unique/load=1000 7.8±0.39µs 126.0 KElem/sec N/A N/A
sqlite/disk/insert_1/location/unique/load=0 7.4±0.14µs 131.4 KElem/sec N/A N/A
sqlite/disk/insert_1/location/unique/load=1000 7.7±0.29µs 126.7 KElem/sec N/A N/A
sqlite/disk/insert_1/person/multi_index/load=0 14.8±0.76µs 65.9 KElem/sec N/A N/A
sqlite/disk/insert_1/person/multi_index/load=1000 20.3±0.91µs 48.2 KElem/sec N/A N/A
sqlite/disk/insert_1/person/non_unique/load=0 7.6±0.30µs 128.8 KElem/sec N/A N/A
sqlite/disk/insert_1/person/non_unique/load=1000 7.9±0.20µs 123.1 KElem/sec N/A N/A
sqlite/disk/insert_1/person/unique/load=0 7.5±0.11µs 129.9 KElem/sec N/A N/A
sqlite/disk/insert_1/person/unique/load=1000 8.0±0.16µs 121.5 KElem/sec N/A N/A
sqlite/disk/insert_bulk/location/multi_index/load=0/count=100 127.2±1.43µs 127.8±1.51µs +0.47%
sqlite/disk/insert_bulk/location/multi_index/load=1000/count=100 211.2±3.66µs 213.8±3.30µs +1.23%
sqlite/disk/insert_bulk/location/non_unique/load=0/count=100 41.5±0.28µs 23.5 KElem/sec N/A N/A
sqlite/disk/insert_bulk/location/non_unique/load=1000/count=100 45.9±0.34µs 21.3 KElem/sec N/A N/A
sqlite/disk/insert_bulk/location/unique/load=0/count=100 43.7±0.34µs 22.3 KElem/sec N/A N/A
sqlite/disk/insert_bulk/location/unique/load=1000/count=100 50.0±0.53µs 19.5 KElem/sec N/A N/A
sqlite/disk/insert_bulk/person/multi_index/load=0/count=100 116.6±2.36µs 114.5±3.66µs -1.80%
sqlite/disk/insert_bulk/person/multi_index/load=1000/count=100 255.0±5.30µs 250.5±5.16µs -1.76%
sqlite/disk/insert_bulk/person/non_unique/load=0/count=100 41.8±0.71µs 23.3 KElem/sec N/A N/A
sqlite/disk/insert_bulk/person/non_unique/load=1000/count=100 58.9±2.30µs 16.6 KElem/sec N/A N/A
sqlite/disk/insert_bulk/person/unique/load=0/count=100 44.0±0.90µs 22.2 KElem/sec N/A N/A
sqlite/disk/insert_bulk/person/unique/load=1000/count=100 50.7±0.76µs 19.3 KElem/sec N/A N/A
sqlite/disk/iterate/location/unique/count=100 8.6±0.16µs 113.5 KElem/sec N/A N/A
sqlite/disk/iterate/person/unique/count=100 8.6±0.12µs 113.3 KElem/sec N/A N/A
sqlite/mem/empty 422.7±3.37ns 424.3±2.17ns +0.38%
sqlite/mem/filter/string/indexed/load=1000/count=10 4.1±0.02µs 235.4 KElem/sec N/A N/A
sqlite/mem/filter/string/non_indexed/load=1000/count=10 55.5±0.27µs 17.6 KElem/sec N/A N/A
sqlite/mem/filter/u64/indexed/load=1000/count=10 4.0±0.10µs 246.5 KElem/sec N/A N/A
sqlite/mem/filter/u64/non_indexed/load=1000/count=10 38.3±0.43µs 25.5 KElem/sec N/A N/A
sqlite/mem/find_unique/u32/load=1000 1034.7±6.38ns 943.8 KElem/sec N/A N/A
sqlite/mem/insert_1/location/multi_index/load=0 4.4±0.12µs 220.5 KElem/sec N/A N/A
sqlite/mem/insert_1/location/multi_index/load=1000 5.8±0.72µs 168.7 KElem/sec N/A N/A
sqlite/mem/insert_1/location/non_unique/load=0 1796.2±19.21ns 543.7 KElem/sec N/A N/A
sqlite/mem/insert_1/location/non_unique/load=1000 1842.1±44.72ns 530.1 KElem/sec N/A N/A
sqlite/mem/insert_1/location/unique/load=0 1779.4±11.95ns 548.8 KElem/sec N/A N/A
sqlite/mem/insert_1/location/unique/load=1000 1885.5±51.53ns 517.9 KElem/sec N/A N/A
sqlite/mem/insert_1/person/multi_index/load=0 4.3±0.08µs 228.8 KElem/sec N/A N/A
sqlite/mem/insert_1/person/multi_index/load=1000 6.5±0.23µs 149.8 KElem/sec N/A N/A
sqlite/mem/insert_1/person/non_unique/load=0 1857.9±35.74ns 525.6 KElem/sec N/A N/A
sqlite/mem/insert_1/person/non_unique/load=1000 1961.1±39.28ns 498.0 KElem/sec N/A N/A
sqlite/mem/insert_1/person/unique/load=0 1852.2±13.41ns 527.2 KElem/sec N/A N/A
sqlite/mem/insert_1/person/unique/load=1000 2.0±0.04µs 487.7 KElem/sec N/A N/A
sqlite/mem/insert_bulk/location/multi_index/load=0/count=100 115.5±2.53µs 115.0±0.71µs -0.43%
sqlite/mem/insert_bulk/location/multi_index/load=1000/count=100 167.5±1.42µs 170.4±3.13µs +1.73%
sqlite/mem/insert_bulk/location/non_unique/load=0/count=100 36.0±1.16µs 27.1 KElem/sec N/A N/A
sqlite/mem/insert_bulk/location/non_unique/load=1000/count=100 38.6±0.92µs 25.3 KElem/sec N/A N/A
sqlite/mem/insert_bulk/location/unique/load=0/count=100 39.0±1.55µs 25.0 KElem/sec N/A N/A
sqlite/mem/insert_bulk/location/unique/load=1000/count=100 43.4±1.84µs 22.5 KElem/sec N/A N/A
sqlite/mem/insert_bulk/person/multi_index/load=0/count=100 103.2±1.42µs 102.1±1.75µs -1.07%
sqlite/mem/insert_bulk/person/multi_index/load=1000/count=100 198.1±6.56µs 194.3±2.51µs -1.92%
sqlite/mem/insert_bulk/person/non_unique/load=0/count=100 35.7±0.63µs 27.3 KElem/sec N/A N/A
sqlite/mem/insert_bulk/person/non_unique/load=1000/count=100 41.9±0.66µs 23.3 KElem/sec N/A N/A
sqlite/mem/insert_bulk/person/unique/load=0/count=100 38.1±0.80µs 25.7 KElem/sec N/A N/A
sqlite/mem/insert_bulk/person/unique/load=1000/count=100 43.1±0.80µs 22.7 KElem/sec N/A N/A
sqlite/mem/iterate/location/unique/count=100 7.0±0.05µs 139.0 KElem/sec N/A N/A
sqlite/mem/iterate/person/unique/count=100 7.3±0.11µs 133.2 KElem/sec N/A N/A
stdb_module/disk/empty 26.1±1.08µs 25.6±1.29µs -1.92%
stdb_module/disk/filter/string/indexed/load=1000/count=10 60.5±6.75µs 16.1 KElem/sec N/A N/A
stdb_module/disk/filter/string/non_indexed/load=1000/count=10 148.6±8.00µs 152.2±13.22µs +2.42%
stdb_module/disk/filter/u64/indexed/load=1000/count=10 48.3±3.47µs 20.2 KElem/sec N/A N/A
stdb_module/disk/filter/u64/non_indexed/load=1000/count=10 122.9±15.09µs 126.1±22.50µs +2.60%
stdb_module/disk/find_unique/u32/load=1000 34.0±1.69µs 28.8 KElem/sec N/A N/A
stdb_module/disk/insert_1/location/multi_index/load=0 49.8±3.83µs 19.6 KElem/sec N/A N/A
stdb_module/disk/insert_1/location/multi_index/load=1000 374.3±32.62µs 347.7±28.93µs -7.11%
stdb_module/disk/insert_1/location/non_unique/load=0 47.4±3.56µs 20.6 KElem/sec N/A N/A
stdb_module/disk/insert_1/location/non_unique/load=1000 299.4±32.62µs 281.6±17.79µs -5.95%
stdb_module/disk/insert_1/location/unique/load=0 47.6±3.94µs 20.5 KElem/sec N/A N/A
stdb_module/disk/insert_1/location/unique/load=1000 330.2±26.00µs 325.2±29.52µs -1.51%
stdb_module/disk/insert_1/person/multi_index/load=0 58.6±6.38µs 16.7 KElem/sec N/A N/A
stdb_module/disk/insert_1/person/multi_index/load=1000 491.6±44.21µs 456.2±60.21µs -7.20%
stdb_module/disk/insert_1/person/non_unique/load=0 47.8±4.86µs 20.4 KElem/sec N/A N/A
stdb_module/disk/insert_1/person/non_unique/load=1000 334.6±29.47µs 311.4±40.72µs -6.93%
stdb_module/disk/insert_1/person/unique/load=0 54.5±5.11µs 17.9 KElem/sec N/A N/A
stdb_module/disk/insert_1/person/unique/load=1000 377.6±33.41µs 399.8±44.75µs +5.88%
stdb_module/disk/insert_bulk/location/multi_index/load=0/count=100 885.2±24.66µs 877.7±35.59µs -0.85%
stdb_module/disk/insert_bulk/location/multi_index/load=1000/count=100 1172.1±47.58µs 1158.0±63.46µs -1.20%
stdb_module/disk/insert_bulk/location/non_unique/load=0/count=100 612.8±18.75µs 621.5±16.87µs +1.42%
stdb_module/disk/insert_bulk/location/non_unique/load=1000/count=100 849.1±244.60µs 816.9±63.04µs -3.79%
stdb_module/disk/insert_bulk/location/unique/load=0/count=100 758.3±19.93µs 744.5±16.31µs -1.82%
stdb_module/disk/insert_bulk/location/unique/load=1000/count=100 994.1±35.78µs 1003.3±42.71µs +0.93%
stdb_module/disk/insert_bulk/person/multi_index/load=0/count=100 1519.5±60.93µs 1438.0±32.91µs -5.36%
stdb_module/disk/insert_bulk/person/multi_index/load=1000/count=100 1839.1±85.59µs 1790.6±66.21µs -2.64%
stdb_module/disk/insert_bulk/person/non_unique/load=0/count=100 808.4±21.84µs 813.1±32.57µs +0.58%
stdb_module/disk/insert_bulk/person/non_unique/load=1000/count=100 1065.3±39.00µs 1021.8±69.86µs -4.08%
stdb_module/disk/insert_bulk/person/unique/load=0/count=100 1028.5±24.33µs 1026.3±33.46µs -0.21%
stdb_module/disk/insert_bulk/person/unique/load=1000/count=100 1378.8±66.79µs 1364.3±65.39µs -1.05%
stdb_module/disk/iterate/location/unique/count=100 144.9±3.90µs 133.5±3.95µs -7.87%
stdb_module/disk/iterate/person/unique/count=100 235.7±7.17µs 236.3±16.53µs +0.25%
stdb_module/large_arguments/64KiB 106.4±7.38µs 107.8±9.82µs +1.32%
stdb_module/mem/empty 26.2±1.12µs 29.1±7.93µs +11.07%
stdb_module/mem/filter/string/indexed/load=1000/count=10 62.5±4.69µs 15.6 KElem/sec N/A N/A
stdb_module/mem/filter/string/non_indexed/load=1000/count=10 148.8±6.50µs 142.2±2.58µs -4.44%
stdb_module/mem/filter/u64/indexed/load=1000/count=10 46.4±5.57µs 21.0 KElem/sec N/A N/A
stdb_module/mem/filter/u64/non_indexed/load=1000/count=10 116.5±2.86µs 112.3±4.30µs -3.61%
stdb_module/mem/find_unique/u32/load=1000 34.4±1.52µs 28.4 KElem/sec N/A N/A
stdb_module/mem/insert_1/location/multi_index/load=0 42.0±2.60µs 23.2 KElem/sec N/A N/A
stdb_module/mem/insert_1/location/multi_index/load=1000 304.0±19.90µs 327.3±24.62µs +7.66%
stdb_module/mem/insert_1/location/non_unique/load=0 40.2±2.14µs 24.3 KElem/sec N/A N/A
stdb_module/mem/insert_1/location/non_unique/load=1000 222.2±21.95µs 187.7±22.05µs -15.53%
stdb_module/mem/insert_1/location/unique/load=0 41.0±2.52µs 23.8 KElem/sec N/A N/A
stdb_module/mem/insert_1/location/unique/load=1000 280.0±19.78µs 272.9±24.24µs -2.54%
stdb_module/mem/insert_1/person/multi_index/load=0 47.1±3.31µs 20.8 KElem/sec N/A N/A
stdb_module/mem/insert_1/person/multi_index/load=1000 413.8±53.57µs 406.0±40.53µs -1.88%
stdb_module/mem/insert_1/person/non_unique/load=0 42.9±5.04µs 22.8 KElem/sec N/A N/A
stdb_module/mem/insert_1/person/non_unique/load=1000 278.7±34.20µs 265.0±39.02µs -4.92%
stdb_module/mem/insert_1/person/unique/load=0 45.0±3.54µs 21.7 KElem/sec N/A N/A
stdb_module/mem/insert_1/person/unique/load=1000 357.0±37.82µs 362.1±51.90µs +1.43%
stdb_module/mem/insert_bulk/location/multi_index/load=0/count=100 775.7±27.61µs 757.6±13.48µs -2.33%
stdb_module/mem/insert_bulk/location/multi_index/load=1000/count=100 1015.0±38.56µs 1035.8±36.48µs +2.05%
stdb_module/mem/insert_bulk/location/non_unique/load=0/count=100 509.5±12.13µs 506.2±13.42µs -0.65%
stdb_module/mem/insert_bulk/location/non_unique/load=1000/count=100 660.1±39.52µs 636.9±31.78µs -3.51%
stdb_module/mem/insert_bulk/location/unique/load=0/count=100 657.6±26.55µs 647.5±23.45µs -1.54%
stdb_module/mem/insert_bulk/location/unique/load=1000/count=100 864.9±34.33µs 865.5±51.83µs +0.07%
stdb_module/mem/insert_bulk/person/multi_index/load=0/count=100 1326.9±44.46µs 1367.1±38.36µs +3.03%
stdb_module/mem/insert_bulk/person/multi_index/load=1000/count=100 1677.9±81.85µs 1728.4±68.68µs +3.01%
stdb_module/mem/insert_bulk/person/non_unique/load=0/count=100 714.1±21.63µs 732.9±22.35µs +2.63%
stdb_module/mem/insert_bulk/person/non_unique/load=1000/count=100 938.2±40.76µs 927.5±33.46µs -1.14%
stdb_module/mem/insert_bulk/person/unique/load=0/count=100 942.9±33.91µs 925.6±12.58µs -1.83%
stdb_module/mem/insert_bulk/person/unique/load=1000/count=100 1251.3±57.46µs 1223.7±37.94µs -2.21%
stdb_module/mem/iterate/location/unique/count=100 139.3±3.56µs 132.4±3.63µs -4.95%
stdb_module/mem/iterate/person/unique/count=100 228.6±10.99µs 223.4±4.12µs -2.27%
stdb_module/print_bulk/lines=1 33.1±2.06µs 35.0±2.45µs +5.74%
stdb_module/print_bulk/lines=100 319.9±4.22µs 322.7±11.84µs +0.88%
stdb_module/print_bulk/lines=1000 2.9±0.03ms 2.9±0.06ms 0.00%
stdb_raw/disk/empty 102.7±1.05ns 103.3±0.92ns +0.58%
stdb_raw/disk/filter/string/indexed/load=1000/count=10 2.6±0.07µs 379.7 KElem/sec N/A N/A
stdb_raw/disk/filter/string/non_indexed/load=1000/count=10 96.9±1.01µs 10.1 KElem/sec N/A N/A
stdb_raw/disk/filter/u64/indexed/load=1000/count=10 2.4±0.04µs 405.8 KElem/sec N/A N/A
stdb_raw/disk/filter/u64/non_indexed/load=1000/count=10 78.5±1.74µs 12.4 KElem/sec N/A N/A
stdb_raw/disk/find_unique/u32/load=1000 557.4±12.82ns 1751.9 KElem/sec N/A N/A
stdb_raw/disk/insert_1/location/multi_index/load=0 6.3±0.19µs 154.5 KElem/sec N/A N/A
stdb_raw/disk/insert_1/location/multi_index/load=1000 33.5±1.71µs 29.2 KElem/sec N/A N/A
stdb_raw/disk/insert_1/location/non_unique/load=0 4.0±0.08µs 246.6 KElem/sec N/A N/A
stdb_raw/disk/insert_1/location/non_unique/load=1000 20.4±0.72µs 48.0 KElem/sec N/A N/A
stdb_raw/disk/insert_1/location/unique/load=0 5.0±0.09µs 194.4 KElem/sec N/A N/A
stdb_raw/disk/insert_1/location/unique/load=1000 27.0±8.92µs 36.1 KElem/sec N/A N/A
stdb_raw/disk/insert_1/person/multi_index/load=0 10.3±0.21µs 94.6 KElem/sec N/A N/A
stdb_raw/disk/insert_1/person/multi_index/load=1000 33.5±6.88µs 29.2 KElem/sec N/A N/A
stdb_raw/disk/insert_1/person/non_unique/load=0 4.6±0.16µs 211.4 KElem/sec N/A N/A
stdb_raw/disk/insert_1/person/non_unique/load=1000 17.5±5.25µs 55.9 KElem/sec N/A N/A
stdb_raw/disk/insert_1/person/unique/load=0 6.8±0.11µs 143.3 KElem/sec N/A N/A
stdb_raw/disk/insert_1/person/unique/load=1000 26.7±3.26µs 36.6 KElem/sec N/A N/A
stdb_raw/disk/insert_bulk/location/multi_index/load=0/count=100 361.5±4.89µs 372.8±7.63µs +3.13%
stdb_raw/disk/insert_bulk/location/multi_index/load=1000/count=100 426.6±8.15µs 439.1±15.96µs +2.93%
stdb_raw/disk/insert_bulk/location/non_unique/load=0/count=100 166.0±3.17µs 165.6±5.16µs -0.24%
stdb_raw/disk/insert_bulk/location/non_unique/load=1000/count=100 189.5±4.01µs 190.1±5.14µs +0.32%
stdb_raw/disk/insert_bulk/location/unique/load=0/count=100 260.5±2.49µs 262.4±3.65µs +0.73%
stdb_raw/disk/insert_bulk/location/unique/load=1000/count=100 319.5±8.56µs 325.4±16.27µs +1.85%
stdb_raw/disk/insert_bulk/person/multi_index/load=0/count=100 748.0±17.09µs 756.0±8.42µs +1.07%
stdb_raw/disk/insert_bulk/person/multi_index/load=1000/count=100 818.5±18.29µs 844.4±28.53µs +3.16%
stdb_raw/disk/insert_bulk/person/non_unique/load=0/count=100 228.8±1.90µs 231.4±1.14µs +1.14%
stdb_raw/disk/insert_bulk/person/non_unique/load=1000/count=100 253.5±1.89µs 256.2±3.38µs +1.07%
stdb_raw/disk/insert_bulk/person/unique/load=0/count=100 424.4±13.01µs 427.0±3.93µs +0.61%
stdb_raw/disk/insert_bulk/person/unique/load=1000/count=100 476.0±8.56µs 480.7±3.18µs +0.99%
stdb_raw/disk/iterate/location/unique/count=100 7.1±0.17µs 138.5 KElem/sec N/A N/A
stdb_raw/disk/iterate/person/unique/count=100 8.5±0.33µs 114.6 KElem/sec N/A N/A
stdb_raw/mem/empty 103.1±1.57ns 103.1±0.79ns 0.00%
stdb_raw/mem/filter/string/indexed/load=1000/count=10 2.6±0.03µs 379.8 KElem/sec N/A N/A
stdb_raw/mem/filter/string/non_indexed/load=1000/count=10 96.6±1.73µs 10.1 KElem/sec N/A N/A
stdb_raw/mem/filter/u64/indexed/load=1000/count=10 2.4±0.04µs 409.0 KElem/sec N/A N/A
stdb_raw/mem/filter/u64/non_indexed/load=1000/count=10 78.0±1.02µs 12.5 KElem/sec N/A N/A
stdb_raw/mem/find_unique/u32/load=1000 557.4±10.22ns 1752.1 KElem/sec N/A N/A
stdb_raw/mem/insert_1/location/multi_index/load=0 4.8±0.05µs 202.2 KElem/sec N/A N/A
stdb_raw/mem/insert_1/location/multi_index/load=1000 26.6±0.95µs 36.7 KElem/sec N/A N/A
stdb_raw/mem/insert_1/location/non_unique/load=0 2.8±0.04µs 353.8 KElem/sec N/A N/A
stdb_raw/mem/insert_1/location/non_unique/load=1000 16.4±0.36µs 59.6 KElem/sec N/A N/A
stdb_raw/mem/insert_1/location/unique/load=0 3.6±0.11µs 272.7 KElem/sec N/A N/A
stdb_raw/mem/insert_1/location/unique/load=1000 22.1±1.11µs 44.1 KElem/sec N/A N/A
stdb_raw/mem/insert_1/person/multi_index/load=0 8.6±0.09µs 113.2 KElem/sec N/A N/A
stdb_raw/mem/insert_1/person/multi_index/load=1000 24.8±2.67µs 39.3 KElem/sec N/A N/A
stdb_raw/mem/insert_1/person/non_unique/load=0 3.2±0.02µs 308.1 KElem/sec N/A N/A
stdb_raw/mem/insert_1/person/non_unique/load=1000 11.5±0.49µs 85.1 KElem/sec N/A N/A
stdb_raw/mem/insert_1/person/unique/load=0 5.2±0.11µs 187.4 KElem/sec N/A N/A
stdb_raw/mem/insert_1/person/unique/load=1000 19.1±0.75µs 51.2 KElem/sec N/A N/A
stdb_raw/mem/insert_bulk/location/multi_index/load=0/count=100 362.7±4.73µs 370.7±1.96µs +2.21%
stdb_raw/mem/insert_bulk/location/multi_index/load=1000/count=100 413.7±7.47µs 423.5±4.50µs +2.37%
stdb_raw/mem/insert_bulk/location/non_unique/load=0/count=100 161.3±3.10µs 161.6±0.69µs +0.19%
stdb_raw/mem/insert_bulk/location/non_unique/load=1000/count=100 183.5±4.50µs 184.6±3.02µs +0.60%
stdb_raw/mem/insert_bulk/location/unique/load=0/count=100 259.1±3.26µs 259.4±1.87µs +0.12%
stdb_raw/mem/insert_bulk/location/unique/load=1000/count=100 309.1±5.47µs 315.3±5.37µs +2.01%
stdb_raw/mem/insert_bulk/person/multi_index/load=0/count=100 733.1±5.98µs 744.7±15.08µs +1.58%
stdb_raw/mem/insert_bulk/person/multi_index/load=1000/count=100 801.4±13.56µs 809.7±14.31µs +1.04%
stdb_raw/mem/insert_bulk/person/non_unique/load=0/count=100 227.5±1.44µs 231.0±4.43µs +1.54%
stdb_raw/mem/insert_bulk/person/non_unique/load=1000/count=100 246.8±5.28µs 248.0±2.23µs +0.49%
stdb_raw/mem/insert_bulk/person/unique/load=0/count=100 427.4±10.45µs 426.6±3.29µs -0.19%
stdb_raw/mem/insert_bulk/person/unique/load=1000/count=100 465.6±5.32µs 473.8±13.14µs +1.76%
stdb_raw/mem/iterate/location/unique/count=100 7.0±0.09µs 139.0 KElem/sec N/A N/A
stdb_raw/mem/iterate/person/unique/count=100 8.3±0.11µs 118.4 KElem/sec N/A N/A

Please sign in to comment.