diff --git a/benchmarks/scripts/parse_benchmarks.py b/benchmarks/scripts/parse_benchmarks.py new file mode 100755 index 00000000..a7f1ee04 --- /dev/null +++ b/benchmarks/scripts/parse_benchmarks.py @@ -0,0 +1,240 @@ +#!/usr/bin/env python3 +import re +import sys +import csv +import logging +from itertools import product + +CHANGE_RE = re.compile(r'^(improved|regressed)\s+by\s+([\d.]+)%\s*$', re.IGNORECASE) +def parse_change(text): + m = CHANGE_RE.match(text or '') + if not m: + return 0.0 + direction, fraction = m.group(1).lower(), float(m.group(2)) / 100.0 + return -fraction if direction == 'improved' else fraction + + +METRIC_RE = re.compile( + r'^\s*(?P[^:]+):\s*' + r'(?P[\d.]+)\s*(?P\w+)' + r'(?:\s*\((?P[^)]+)\))?' +) +def parse_metric(line): + m = METRIC_RE.match(line) + if m: + change = m.group('change') + #print(change) + return ( + m.group('name').strip(), + float(m.group('value')), + m.group('unit'), + parse_change(change) + ) + + +BENCHMARK_RE = re.compile(r'^\s*Benchmark:\s+(?P.+?)(\s*\(new\))?\s*$') +UNIT_MULTIPLIERS = {'K': 10**3, 'M': 10**6, 'B': 10**9} +METRICS = { + 'instructions': ('instructions', UNIT_MULTIPLIERS), + 'heap_increase': ('heap_increase', 1), + 'stable_memory_increase': ('stable_memory_increase', 1), +} +def parse_bench_blocks(lines): + benchmarks = [] + current = None + + for line in lines: + bm = BENCHMARK_RE.match(line) + if bm: + if current: + benchmarks.append(current) + current = {'name': bm.group('name').strip()} + continue + + if not current: + continue + + parsed = parse_metric(line) + if not parsed: + continue + + name, val, unit, change = parsed + info = METRICS.get(name) + if not info: + continue + + field, mult = info + factor = mult.get(unit, 1) if isinstance(mult, dict) else mult + value = int(val * factor) + + if value: + current[field] = {'value': value, 'change': change} + + if current: + benchmarks.append(current) + return benchmarks + +BENCH_PREFIX_RE = re.compile( + r'btreemap_v(?P\d+)' + r'(?P_mem_manager)*' + r'_(?P\w+)' +) +FUNCTIONS = [ + 'insert', 'remove', 'get', 'contains', 'scan', 'pop_first', 'pop_last' +] +_FUNCS_PATTERN = "|".join(map(re.escape, FUNCTIONS)) +BENCH_FUNC_RE = re.compile( + rf"(?P{_FUNCS_PATTERN})_(?P\w+)?" +) +BENCH_TYPE_KEY_VALUE_RE = re.compile( + r'(?Pblob|vec)' + r'_(?P\d+)' + r'_(?P\d+)' +) +BENCH_TYPES_A_B_RE = re.compile( + r'(?Pu\d+|blob\d+|vec\d+)' + r'_(?Pu\d+|blob\d+|vec\d+)' +) + + +def parse_bench_by_name(bench): + m = BENCH_PREFIX_RE.match(bench['name']) + if m: + data = { + 'name': bench['name'], + 'version': int(m.group('version')), + 'mem_manager': len(m.group('mem_manager') or '') > 0, + 'instructions': bench['instructions']['value'], + 'instructions_change': bench['instructions']['change'], + } + + m = BENCH_FUNC_RE.match(m.group('remaining')) + if m: + data['func'] = m.group('func') + + remaining = m.group('remaining') + m = BENCH_TYPE_KEY_VALUE_RE.match(remaining) + if m: + data.update({ + 'schema': 'type-key-value', + 'type': m.group('type'), + 'key_size': int(m.group('k_size')), + 'value_size': int(m.group('v_size')), + }) + return data + + m = BENCH_TYPES_A_B_RE.match(remaining) + if m: + data.update({ + 'schema': 'types-a-b', + 'type_a': m.group('type_a'), + 'type_b': m.group('type_b'), + }) + return data + + +def load_benchmarks(path, verbose=False, logger=None): + logger = logger or logging.getLogger(__name__) + out = [] + with open(path) as f: + for block in parse_bench_blocks(f): + parsed = parse_bench_by_name(block) + if parsed: + out.append(parsed) + if verbose: + logger.info(f"Parsed: {parsed}") + elif verbose: + logger.warning(f"Failed to parse: {block['name'].strip()!r}") + return out + + +def save_all_tables(tables, sizes, filename): + fmt_instr = lambda v: "" if v is None else '{:.3f}'.format(v / 1e9) + fmt_change = lambda v: "" if v is None else '{:.1f}%'.format(v * 100.0) + + with open(filename, 'w', newline='') as f: + writer = csv.writer(f, delimiter='\t') + for tbl in tables: + writer.writerow([tbl['name']]) + writer.writerow(['{} | {}'.format(tbl['rows'], tbl['columns'])] + sizes + [''] + sizes) + instr, change = tbl['instructions'], tbl['instructions_change'] + for r in sizes: + writer.writerow( + [r] + + [fmt_instr(instr[r][c]) for c in sizes] + + [''] + + [fmt_change(change[r][c]) for c in sizes] + ) + writer.writerow([]) + + +def main(): + if len(sys.argv) != 2: + print(f"Usage: {sys.argv[0]} ") + sys.exit(1) + + logging.basicConfig(level=logging.WARNING, format="%(levelname)s: %(message)s") + logger = logging.getLogger(__name__) + benchmarks = load_benchmarks(sys.argv[1], verbose=True, logger=logger) + + used = set() + all_tables = [] + for version, func in product( + [2, 1], + FUNCTIONS, + ): + + # Big tables blob/vec 4-1024 + for type_ in ['blob', 'vec']: + size_grid = [4, 8, 16, 32, 64, 128, 256, 512, 1024] + name = f'btreemap_v{version}_{func}_{type_}' + table = { + 'name': name, + 'columns': 'keys', + 'rows': 'values', + 'instructions': {r: {c: None for c in size_grid} for r in size_grid}, + 'instructions_change': {r: {c: None for c in size_grid} for r in size_grid} + } + for key_size in size_grid: + for value_size in size_grid: + filters = { + 'version': version, + 'mem_manager': False, + 'func': func, + 'schema': 'type-key-value', + 'type': type_, + 'key_size': key_size, + 'value_size': value_size, + } + selected = [ + b for b in benchmarks + if all(b.get(k) == v for k, v in filters.items()) + ] + if len(selected) == 0: + continue + if len(selected) > 1: + logger.error(f"Multiple matches for {filters}: {selected}") + continue + data = selected[0] if selected else None + table['instructions'][value_size][key_size] = data['instructions'] if data else None + table['instructions_change'][value_size][key_size] = data['instructions_change'] if data else None + used.add(data['name']) if data else None + + has_any = any( + cell is not None + for row in table['instructions'].values() + for cell in row.values() + ) + if has_any: + all_tables.append(table) + + for bench in benchmarks: + if bench['name'] not in used: + logger.warning(f"Unused benchmark: {bench['name']}") + + save_all_tables(all_tables, size_grid, './tmp/all_benchmarks.csv') + + +# This script allows to extract btreemap benchmarks into a CSV file. +if __name__ == '__main__': + main() diff --git a/benchmarks/src/btreemap.rs b/benchmarks/src/btreemap.rs index a186d3ee..47d8b3ec 100644 --- a/benchmarks/src/btreemap.rs +++ b/benchmarks/src/btreemap.rs @@ -1,22 +1,14 @@ use crate::Random; use canbench_rs::{bench, bench_fn, BenchResult}; use ic_stable_structures::memory_manager::{MemoryId, MemoryManager}; -use ic_stable_structures::{storable::Blob, BTreeMap, DefaultMemoryImpl, Memory, Storable}; +use ic_stable_structures::{ + storable::{Blob, FixedVec}, + BTreeMap, DefaultMemoryImpl, Memory, Storable, +}; use std::ops::Bound; use tiny_rng::{Rand, Rng}; -/// Helper macro to generate benchmarks. -macro_rules! bench_tests { - ($( $fn_name:ident, $helper:ident, $k:expr, $v:expr );+ $(;)?) => { - $( - #[bench(raw)] - pub fn $fn_name() -> BenchResult { - $helper::<$k, $v>() - } - )+ - }; -} - +// Bounded types. type Blob4 = Blob<4>; type Blob8 = Blob<8>; type Blob16 = Blob<16>; @@ -27,453 +19,995 @@ type Blob256 = Blob<256>; type Blob512 = Blob<512>; type Blob1024 = Blob<1024>; -// Benchmarks inserting blobs into a BTreeMap. -bench_tests! { - // K x 1024 - btreemap_insert_blob_4_1024, insert_helper_v1, Blob4, Blob1024; - btreemap_insert_blob_4_1024_v2, insert_helper_v2, Blob4, Blob1024; - btreemap_insert_blob_8_1024, insert_helper_v1, Blob8, Blob1024; - btreemap_insert_blob_8_1024_v2, insert_helper_v2, Blob8, Blob1024; - btreemap_insert_blob_16_1024, insert_helper_v1, Blob16, Blob1024; - btreemap_insert_blob_16_1024_v2, insert_helper_v2, Blob16, Blob1024; - btreemap_insert_blob_32_1024, insert_helper_v1, Blob32, Blob1024; - btreemap_insert_blob_32_1024_v2, insert_helper_v2, Blob32, Blob1024; - btreemap_insert_blob_64_1024, insert_helper_v1, Blob64, Blob1024; - btreemap_insert_blob_64_1024_v2, insert_helper_v2, Blob64, Blob1024; - btreemap_insert_blob_128_1024, insert_helper_v1, Blob128, Blob1024; - btreemap_insert_blob_128_1024_v2, insert_helper_v2, Blob128, Blob1024; - btreemap_insert_blob_256_1024, insert_helper_v1, Blob256, Blob1024; - btreemap_insert_blob_256_1024_v2, insert_helper_v2, Blob256, Blob1024; - btreemap_insert_blob_512_1024, insert_helper_v1, Blob512, Blob1024; - btreemap_insert_blob_512_1024_v2, insert_helper_v2, Blob512, Blob1024; - - // 1024 x V - btreemap_insert_blob_1024_4, insert_helper_v1, Blob1024, Blob4; - btreemap_insert_blob_1024_4_v2, insert_helper_v2, Blob1024, Blob4; - btreemap_insert_blob_1024_8, insert_helper_v1, Blob1024, Blob8; - btreemap_insert_blob_1024_8_v2, insert_helper_v2, Blob1024, Blob8; - btreemap_insert_blob_1024_16, insert_helper_v1, Blob1024, Blob16; - btreemap_insert_blob_1024_16_v2, insert_helper_v2, Blob1024, Blob16; - btreemap_insert_blob_1024_32, insert_helper_v1, Blob1024, Blob32; - btreemap_insert_blob_1024_32_v2, insert_helper_v2, Blob1024, Blob32; - btreemap_insert_blob_1024_64, insert_helper_v1, Blob1024, Blob64; - btreemap_insert_blob_1024_64_v2, insert_helper_v2, Blob1024, Blob64; - btreemap_insert_blob_1024_128, insert_helper_v1, Blob1024, Blob128; - btreemap_insert_blob_1024_128_v2, insert_helper_v2, Blob1024, Blob128; - btreemap_insert_blob_1024_256, insert_helper_v1, Blob1024, Blob256; - btreemap_insert_blob_1024_256_v2, insert_helper_v2, Blob1024, Blob256; - btreemap_insert_blob_1024_512, insert_helper_v1, Blob1024, Blob512; - btreemap_insert_blob_1024_512_v2, insert_helper_v2, Blob1024, Blob512; - btreemap_insert_blob_1024_512_v2_mem_manager, insert_helper_v2_mem_manager, Blob1024, Blob512; - - btreemap_insert_u64_u64, insert_helper_v1, u64, u64; - btreemap_insert_u64_u64_v2, insert_helper_v2, u64, u64; - btreemap_insert_u64_u64_v2_mem_manager, insert_helper_v2_mem_manager, u64, u64; - - btreemap_insert_u64_blob_8, insert_helper_v1, u64, Blob8; - btreemap_insert_u64_blob_8_v2, insert_helper_v2, u64, Blob8; - btreemap_insert_blob_8_u64, insert_helper_v1, Blob8, u64; - btreemap_insert_blob_8_u64_v2, insert_helper_v2, Blob8, u64; -} - -// Benchmarks removing keys from a BTreeMap. -bench_tests! { - // K x 1024 - btreemap_remove_blob_4_1024, remove_helper_v1, Blob4, Blob1024; - btreemap_remove_blob_4_1024_v2, remove_helper_v2, Blob4, Blob1024; - btreemap_remove_blob_8_1024, remove_helper_v1, Blob8, Blob1024; - btreemap_remove_blob_8_1024_v2, remove_helper_v2, Blob8, Blob1024; - btreemap_remove_blob_16_1024, remove_helper_v1, Blob16, Blob1024; - btreemap_remove_blob_16_1024_v2, remove_helper_v2, Blob16, Blob1024; - btreemap_remove_blob_32_1024, remove_helper_v1, Blob32, Blob1024; - btreemap_remove_blob_32_1024_v2, remove_helper_v2, Blob32, Blob1024; - btreemap_remove_blob_64_1024, remove_helper_v1, Blob64, Blob1024; - btreemap_remove_blob_64_1024_v2, remove_helper_v2, Blob64, Blob1024; - btreemap_remove_blob_128_1024, remove_helper_v1, Blob128, Blob1024; - btreemap_remove_blob_128_1024_v2, remove_helper_v2, Blob128, Blob1024; - btreemap_remove_blob_256_1024, remove_helper_v1, Blob256, Blob1024; - btreemap_remove_blob_256_1024_v2, remove_helper_v2, Blob256, Blob1024; - btreemap_remove_blob_512_1024, remove_helper_v1, Blob512, Blob1024; - btreemap_remove_blob_512_1024_v2, remove_helper_v2, Blob512, Blob1024; - - btreemap_remove_u64_u64, remove_helper_v1, u64, u64; - btreemap_remove_u64_u64_v2, remove_helper_v2, u64, u64; - - btreemap_remove_u64_blob_8, remove_helper_v1, u64, Blob8; - btreemap_remove_u64_blob_8_v2, remove_helper_v2, u64, Blob8; - btreemap_remove_blob_8_u64, remove_helper_v1, Blob8, u64; - btreemap_remove_blob_8_u64_v2, remove_helper_v2, Blob8, u64; -} - -// Benchmarks getting keys from a BTreeMap. -bench_tests! { - // K x 1024 - btreemap_get_blob_4_1024, get_helper_v1, Blob4, Blob1024; - btreemap_get_blob_4_1024_v2, get_helper_v2, Blob4, Blob1024; - btreemap_get_blob_8_1024, get_helper_v1, Blob8, Blob1024; - btreemap_get_blob_8_1024_v2, get_helper_v2, Blob8, Blob1024; - btreemap_get_blob_16_1024, get_helper_v1, Blob16, Blob1024; - btreemap_get_blob_16_1024_v2, get_helper_v2, Blob16, Blob1024; - btreemap_get_blob_32_1024, get_helper_v1, Blob32, Blob1024; - btreemap_get_blob_32_1024_v2, get_helper_v2, Blob32, Blob1024; - btreemap_get_blob_64_1024, get_helper_v1, Blob64, Blob1024; - btreemap_get_blob_64_1024_v2, get_helper_v2, Blob64, Blob1024; - btreemap_get_blob_128_1024, get_helper_v1, Blob128, Blob1024; - btreemap_get_blob_128_1024_v2, get_helper_v2, Blob128, Blob1024; - btreemap_get_blob_256_1024, get_helper_v1, Blob256, Blob1024; - btreemap_get_blob_256_1024_v2, get_helper_v2, Blob256, Blob1024; - btreemap_get_blob_512_1024, get_helper_v1, Blob512, Blob1024; - btreemap_get_blob_512_1024_v2, get_helper_v2, Blob512, Blob1024; - btreemap_get_blob_512_1024_v2_mem_manager, get_helper_v2_mem_manager, Blob512, Blob1024; - - btreemap_get_u64_u64, get_helper_v1, u64, u64; - btreemap_get_u64_u64_v2, get_helper_v2, u64, u64; - btreemap_get_u64_u64_v2_mem_manager, get_helper_v2_mem_manager, u64, u64; - - btreemap_get_u64_blob_8, get_helper_v1, u64, Blob8; - btreemap_get_u64_blob_8_v2, get_helper_v2, u64, Blob8; - btreemap_get_blob_8_u64, get_helper_v1, Blob8, u64; - btreemap_get_blob_8_u64_v2, get_helper_v2, Blob8, u64; -} - -// Benchmarks `contains_key` of a BTreeMap. -bench_tests! { - btreemap_contains_key_blob_4_1024, contains_key_helper_v1, Blob4, Blob1024; - btreemap_contains_key_blob_4_1024_v2, contains_key_helper_v2, Blob4, Blob1024; -} +// Unbounded types. +type FixedVec4 = FixedVec<4>; +type FixedVec8 = FixedVec<8>; +type FixedVec16 = FixedVec<16>; +type FixedVec32 = FixedVec<32>; +type FixedVec64 = FixedVec<64>; +type FixedVec128 = FixedVec<128>; +type FixedVec256 = FixedVec<256>; +type FixedVec512 = FixedVec<512>; +type FixedVec1024 = FixedVec<1024>; -#[bench(raw)] -pub fn btreemap_insert_10mib_values() -> BenchResult { - let mut btree = BTreeMap::new(DefaultMemoryImpl::default()); +#[allow(non_upper_case_globals)] +const KiB: usize = 1024; +#[allow(non_upper_case_globals)] +const MiB: usize = 1024 * KiB; - // Insert 20 10MiB values. - let mut rng = Rng::from_seed(0); - let mut values = vec![]; - for _ in 0..20 { - values.push( - rng.iter(Rand::rand_u8) - .take(10 * 1024 * 1024) - .collect::>(), - ); - } +trait TestKey: Clone + Ord + Storable + Random {} +impl TestKey for T where T: Clone + Ord + Storable + Random {} - bench_fn(|| { - for (i, value) in values.into_iter().enumerate() { - btree.insert(i as u32, value); - } - }) -} +trait TestValue: Clone + Storable + Random {} +impl TestValue for T where T: Clone + Storable + Random {} -// Read a range of entries but only process the key of each entry. -#[bench(raw)] -pub fn btreemap_read_keys_from_range() -> BenchResult { - let mut btree = BTreeMap::new(DefaultMemoryImpl::default()); - let size: u32 = 10_000; - for i in 0..size { - btree.insert(i, vec![0; 1024]); - } - - bench_fn(|| { - btree - .range((Bound::Included(0), Bound::Included(size))) - .map(|entry| entry.0) - .sum::() - }) +/// Helper macro to generate benchmarks. +macro_rules! bench_tests { + ($( $fn_name:ident, $helper:ident, $k:expr, $v:expr );+ $(;)?) => { + $( + #[bench(raw)] + pub fn $fn_name() -> BenchResult { + $helper::<$k, $v>() + } + )+ + }; } -// Read a range of entries but only process the value from every third entry. -#[bench(raw)] -pub fn btreemap_read_every_third_value_from_range() -> BenchResult { - let mut btree = BTreeMap::new(DefaultMemoryImpl::default()); - let size: u32 = 10_000; - for i in 0..size { - btree.insert(i, vec![0; 1024]); +fn generate_random_kv(n: usize, rng: &mut Rng) -> Vec<(K, V)> { + let mut pairs = Vec::with_capacity(n); + for _ in 0..n { + pairs.push((K::random(rng), V::random(rng))); } - - bench_fn(|| { - btree - .range((Bound::Included(0), Bound::Included(size))) - .filter(|entry| entry.0 % 3 == 0) - .map(|entry| entry.1.len()) - .sum::() - }) + pairs } -#[bench(raw)] -pub fn btreemap_iter_small_values() -> BenchResult { - iter_helper(10_000, 0, IterType::Iter) +fn generate_random_blocks(count: usize, block_size: usize, rng: &mut Rng) -> Vec> { + (0..count) + .map(|_| (0..block_size).map(|_| rng.rand_u8()).collect()) + .collect() } -#[bench(raw)] -pub fn btreemap_iter_rev_small_values() -> BenchResult { - iter_helper(10_000, 0, IterType::IterRev) -} - -#[bench(raw)] -pub fn btreemap_iter_10mib_values() -> BenchResult { - iter_helper(200, 10 * 1024, IterType::Iter) +// Benchmarks for `BTreeMap::insert`. +bench_tests! { + // === V1 === + + // V1 blob K x 128 + btreemap_v1_insert_blob_4_128, insert_helper_v1, Blob4, Blob128; + btreemap_v1_insert_blob_8_128, insert_helper_v1, Blob8, Blob128; + btreemap_v1_insert_blob_16_128, insert_helper_v1, Blob16, Blob128; + btreemap_v1_insert_blob_32_128, insert_helper_v1, Blob32, Blob128; + btreemap_v1_insert_blob_64_128, insert_helper_v1, Blob64, Blob128; + btreemap_v1_insert_blob_128_128, insert_helper_v1, Blob128, Blob128; + btreemap_v1_insert_blob_256_128, insert_helper_v1, Blob256, Blob128; + btreemap_v1_insert_blob_512_128, insert_helper_v1, Blob512, Blob128; + btreemap_v1_insert_blob_1024_128, insert_helper_v1, Blob1024, Blob128; + + // V1 blob 32 x V + btreemap_v1_insert_blob_32_4, insert_helper_v1, Blob32, Blob4; + btreemap_v1_insert_blob_32_8, insert_helper_v1, Blob32, Blob8; + btreemap_v1_insert_blob_32_16, insert_helper_v1, Blob32, Blob16; + btreemap_v1_insert_blob_32_32, insert_helper_v1, Blob32, Blob32; + btreemap_v1_insert_blob_32_64, insert_helper_v1, Blob32, Blob64; + //btreemap_v1_insert_blob_32_128, insert_helper_v1, Blob32, Blob128; + btreemap_v1_insert_blob_32_256, insert_helper_v1, Blob32, Blob256; + btreemap_v1_insert_blob_32_512, insert_helper_v1, Blob32, Blob512; + btreemap_v1_insert_blob_32_1024, insert_helper_v1, Blob32, Blob1024; + + // V1 u64 / blob8 + btreemap_v1_insert_u64_u64, insert_helper_v1, u64, u64; + btreemap_v1_insert_u64_blob8, insert_helper_v1, u64, Blob8; + btreemap_v1_insert_blob8_u64, insert_helper_v1, Blob8, u64; + + // === V2 === + + // V2 blob K x 128 + btreemap_v2_insert_blob_4_128, insert_helper_v2, Blob4, Blob128; + btreemap_v2_insert_blob_8_128, insert_helper_v2, Blob8, Blob128; + btreemap_v2_insert_blob_16_128, insert_helper_v2, Blob16, Blob128; + btreemap_v2_insert_blob_32_128, insert_helper_v2, Blob32, Blob128; + btreemap_v2_insert_blob_64_128, insert_helper_v2, Blob64, Blob128; + btreemap_v2_insert_blob_128_128, insert_helper_v2, Blob128, Blob128; + btreemap_v2_insert_blob_256_128, insert_helper_v2, Blob256, Blob128; + btreemap_v2_insert_blob_512_128, insert_helper_v2, Blob512, Blob128; + btreemap_v2_insert_blob_1024_128, insert_helper_v2, Blob1024, Blob128; + + // V2 blob 32 x V + btreemap_v2_insert_blob_32_4, insert_helper_v2, Blob32, Blob4; + btreemap_v2_insert_blob_32_8, insert_helper_v2, Blob32, Blob8; + btreemap_v2_insert_blob_32_16, insert_helper_v2, Blob32, Blob16; + btreemap_v2_insert_blob_32_32, insert_helper_v2, Blob32, Blob32; + btreemap_v2_insert_blob_32_64, insert_helper_v2, Blob32, Blob64; + //btreemap_v2_insert_blob_32_128, insert_helper_v2, Blob32, Blob128; + btreemap_v2_insert_blob_32_256, insert_helper_v2, Blob32, Blob256; + btreemap_v2_insert_blob_32_512, insert_helper_v2, Blob32, Blob512; + btreemap_v2_insert_blob_32_1024, insert_helper_v2, Blob32, Blob1024; + + // V2 vec K x 128 + btreemap_v2_insert_vec_4_128, insert_helper_v2, FixedVec4, FixedVec128; + btreemap_v2_insert_vec_8_128, insert_helper_v2, FixedVec8, FixedVec128; + btreemap_v2_insert_vec_16_128, insert_helper_v2, FixedVec16, FixedVec128; + btreemap_v2_insert_vec_32_128, insert_helper_v2, FixedVec32, FixedVec128; + btreemap_v2_insert_vec_64_128, insert_helper_v2, FixedVec64, FixedVec128; + btreemap_v2_insert_vec_128_128, insert_helper_v2, FixedVec128, FixedVec128; + btreemap_v2_insert_vec_256_128, insert_helper_v2, FixedVec256, FixedVec128; + btreemap_v2_insert_vec_512_128, insert_helper_v2, FixedVec512, FixedVec128; + btreemap_v2_insert_vec_1024_128, insert_helper_v2, FixedVec1024, FixedVec128; + + // V2 vec 32 x V + btreemap_v2_insert_vec_32_4, insert_helper_v2, FixedVec32, FixedVec4; + btreemap_v2_insert_vec_32_8, insert_helper_v2, FixedVec32, FixedVec8; + btreemap_v2_insert_vec_32_16, insert_helper_v2, FixedVec32, FixedVec16; + btreemap_v2_insert_vec_32_32, insert_helper_v2, FixedVec32, FixedVec32; + btreemap_v2_insert_vec_32_64, insert_helper_v2, FixedVec32, FixedVec64; + //btreemap_v2_insert_vec_32_128, insert_helper_v2, FixedVec32, FixedVec128; + btreemap_v2_insert_vec_32_256, insert_helper_v2, FixedVec32, FixedVec256; + btreemap_v2_insert_vec_32_512, insert_helper_v2, FixedVec32, FixedVec512; + btreemap_v2_insert_vec_32_1024, insert_helper_v2, FixedVec32, FixedVec1024; + + // V2 u64 / blob8 / vec8 + btreemap_v2_insert_u64_u64, insert_helper_v2, u64, u64; + btreemap_v2_insert_u64_blob8, insert_helper_v2, u64, Blob8; + btreemap_v2_insert_blob8_u64, insert_helper_v2, Blob8, u64; + btreemap_v2_insert_u64_vec8, insert_helper_v2, u64, FixedVec8; + btreemap_v2_insert_vec8_u64, insert_helper_v2, FixedVec8, u64; + + // V2 memory manager u64 / blob512 / vec512 + btreemap_v2_mem_manager_insert_u64_u64, insert_helper_v2_mem_manager, u64, u64; + btreemap_v2_mem_manager_insert_u64_blob512, insert_helper_v2_mem_manager, u64, Blob512; + btreemap_v2_mem_manager_insert_blob512_u64, insert_helper_v2_mem_manager, Blob512, u64; + btreemap_v2_mem_manager_insert_u64_vec512, insert_helper_v2_mem_manager, u64, FixedVec512; + btreemap_v2_mem_manager_insert_vec512_u64, insert_helper_v2_mem_manager, FixedVec512, u64; +} + +fn insert_helper_v1() -> BenchResult { + let btree = BTreeMap::new_v1(DefaultMemoryImpl::default()); + insert_helper::(btree) } -#[bench(raw)] -pub fn btreemap_iter_rev_10mib_values() -> BenchResult { - iter_helper(200, 10 * 1024, IterType::IterRev) +fn insert_helper_v2() -> BenchResult { + let btree = BTreeMap::new(DefaultMemoryImpl::default()); + insert_helper::(btree) } -#[bench(raw)] -pub fn btreemap_keys_small_values() -> BenchResult { - iter_helper(10_000, 0, IterType::Keys) +fn insert_helper_v2_mem_manager() -> BenchResult { + let memory_manager = MemoryManager::init(DefaultMemoryImpl::default()); + let btree = BTreeMap::new(memory_manager.get(MemoryId::new(42))); + insert_helper::(btree) } -#[bench(raw)] -pub fn btreemap_keys_rev_small_values() -> BenchResult { - iter_helper(10_000, 0, IterType::KeysRev) -} +// Profiles inserting a large number of random blobs into a btreemap. +fn insert_helper(mut btree: BTreeMap) -> BenchResult { + let count = 10_000; + let mut rng = Rng::from_seed(0); + let items = generate_random_kv::(count, &mut rng); -#[bench(raw)] -pub fn btreemap_keys_10mib_values() -> BenchResult { - iter_helper(200, 10 * 1024, IterType::Keys) + bench_fn(|| { + // Insert the items into the btree. + for (k, v) in items { + btree.insert(k, v); + } + }) } #[bench(raw)] -pub fn btreemap_keys_rev_10mib_values() -> BenchResult { - iter_helper(200, 10 * 1024, IterType::KeysRev) -} +pub fn btreemap_v2_insert_10mib_values() -> BenchResult { + let count = 20; + let mut btree = BTreeMap::new(DefaultMemoryImpl::default()); + let mut rng = Rng::from_seed(0); + let values = generate_random_blocks(count, 10 * MiB, &mut rng); -#[bench(raw)] -pub fn btreemap_values_small_values() -> BenchResult { - iter_helper(10_000, 0, IterType::Values) + bench_fn(|| { + for (i, value) in values.into_iter().enumerate() { + btree.insert(i as u32, value); + } + }) } -#[bench(raw)] -pub fn btreemap_values_rev_small_values() -> BenchResult { - iter_helper(10_000, 0, IterType::ValuesRev) +// Benchmarks for `BTreeMap::remove`. +bench_tests! { + // === V1 === + + // V1 blob K x 128 + btreemap_v1_remove_blob_4_128, remove_helper_v1, Blob4, Blob128; + btreemap_v1_remove_blob_8_128, remove_helper_v1, Blob8, Blob128; + btreemap_v1_remove_blob_16_128, remove_helper_v1, Blob16, Blob128; + btreemap_v1_remove_blob_32_128, remove_helper_v1, Blob32, Blob128; + btreemap_v1_remove_blob_64_128, remove_helper_v1, Blob64, Blob128; + btreemap_v1_remove_blob_128_128, remove_helper_v1, Blob128, Blob128; + btreemap_v1_remove_blob_256_128, remove_helper_v1, Blob256, Blob128; + btreemap_v1_remove_blob_512_128, remove_helper_v1, Blob512, Blob128; + btreemap_v1_remove_blob_1024_128, remove_helper_v1, Blob1024, Blob128; + + // V1 blob 32 x V + btreemap_v1_remove_blob_32_4, remove_helper_v1, Blob32, Blob4; + btreemap_v1_remove_blob_32_8, remove_helper_v1, Blob32, Blob8; + btreemap_v1_remove_blob_32_16, remove_helper_v1, Blob32, Blob16; + btreemap_v1_remove_blob_32_32, remove_helper_v1, Blob32, Blob32; + btreemap_v1_remove_blob_32_64, remove_helper_v1, Blob32, Blob64; + //btreemap_v1_remove_blob_32_128, remove_helper_v1, Blob32, Blob128; + btreemap_v1_remove_blob_32_256, remove_helper_v1, Blob32, Blob256; + btreemap_v1_remove_blob_32_512, remove_helper_v1, Blob32, Blob512; + btreemap_v1_remove_blob_32_1024, remove_helper_v1, Blob32, Blob1024; + + // V1 u64 / blob8 + btreemap_v1_remove_u64_u64, remove_helper_v1, u64, u64; + btreemap_v1_remove_u64_blob8, remove_helper_v1, u64, Blob8; + btreemap_v1_remove_blob8_u64, remove_helper_v1, Blob8, u64; + + // === V2 === + + // V2 blob K x 128 + btreemap_v2_remove_blob_4_128, remove_helper_v2, Blob4, Blob128; + btreemap_v2_remove_blob_8_128, remove_helper_v2, Blob8, Blob128; + btreemap_v2_remove_blob_16_128, remove_helper_v2, Blob16, Blob128; + btreemap_v2_remove_blob_32_128, remove_helper_v2, Blob32, Blob128; + btreemap_v2_remove_blob_64_128, remove_helper_v2, Blob64, Blob128; + btreemap_v2_remove_blob_128_128, remove_helper_v2, Blob128, Blob128; + btreemap_v2_remove_blob_256_128, remove_helper_v2, Blob256, Blob128; + btreemap_v2_remove_blob_512_128, remove_helper_v2, Blob512, Blob128; + btreemap_v2_remove_blob_1024_128, remove_helper_v2, Blob1024, Blob128; + + // V2 blob 32 x V + btreemap_v2_remove_blob_32_4, remove_helper_v2, Blob32, Blob4; + btreemap_v2_remove_blob_32_8, remove_helper_v2, Blob32, Blob8; + btreemap_v2_remove_blob_32_16, remove_helper_v2, Blob32, Blob16; + btreemap_v2_remove_blob_32_32, remove_helper_v2, Blob32, Blob32; + btreemap_v2_remove_blob_32_64, remove_helper_v2, Blob32, Blob64; + //btreemap_v2_remove_blob_32_128, remove_helper_v2, Blob32, Blob128; + btreemap_v2_remove_blob_32_256, remove_helper_v2, Blob32, Blob256; + btreemap_v2_remove_blob_32_512, remove_helper_v2, Blob32, Blob512; + btreemap_v2_remove_blob_32_1024, remove_helper_v2, Blob32, Blob1024; + + // V2 vec K x 128 + btreemap_v2_remove_vec_4_128, remove_helper_v2, FixedVec4, FixedVec128; + btreemap_v2_remove_vec_8_128, remove_helper_v2, FixedVec8, FixedVec128; + btreemap_v2_remove_vec_16_128, remove_helper_v2, FixedVec16, FixedVec128; + btreemap_v2_remove_vec_32_128, remove_helper_v2, FixedVec32, FixedVec128; + btreemap_v2_remove_vec_64_128, remove_helper_v2, FixedVec64, FixedVec128; + btreemap_v2_remove_vec_128_128, remove_helper_v2, FixedVec128, FixedVec128; + btreemap_v2_remove_vec_256_128, remove_helper_v2, FixedVec256, FixedVec128; + btreemap_v2_remove_vec_512_128, remove_helper_v2, FixedVec512, FixedVec128; + btreemap_v2_remove_vec_1024_128, remove_helper_v2, FixedVec1024, FixedVec128; + + // V2 vec 32 x V + btreemap_v2_remove_vec_32_4, remove_helper_v2, FixedVec32, FixedVec4; + btreemap_v2_remove_vec_32_8, remove_helper_v2, FixedVec32, FixedVec8; + btreemap_v2_remove_vec_32_16, remove_helper_v2, FixedVec32, FixedVec16; + btreemap_v2_remove_vec_32_32, remove_helper_v2, FixedVec32, FixedVec32; + btreemap_v2_remove_vec_32_64, remove_helper_v2, FixedVec32, FixedVec64; + //btreemap_v2_remove_vec_32_128, remove_helper_v2, FixedVec32, FixedVec128; + btreemap_v2_remove_vec_32_256, remove_helper_v2, FixedVec32, FixedVec256; + btreemap_v2_remove_vec_32_512, remove_helper_v2, FixedVec32, FixedVec512; + btreemap_v2_remove_vec_32_1024, remove_helper_v2, FixedVec32, FixedVec1024; + + // V2 u64 / blob8 / vec8 + btreemap_v2_remove_u64_u64, remove_helper_v2, u64, u64; + btreemap_v2_remove_u64_blob8, remove_helper_v2, u64, Blob8; + btreemap_v2_remove_blob8_u64, remove_helper_v2, Blob8, u64; + btreemap_v2_remove_u64_vec8, remove_helper_v2, u64, FixedVec8; + btreemap_v2_remove_vec8_u64, remove_helper_v2, FixedVec8, u64; + + // V2 memory manager u64 / blob512 / vec512 + btreemap_v2_mem_manager_remove_u64_u64, remove_helper_v2_mem_manager, u64, u64; + btreemap_v2_mem_manager_remove_u64_blob512, remove_helper_v2_mem_manager, u64, Blob512; + btreemap_v2_mem_manager_remove_blob512_u64, remove_helper_v2_mem_manager, Blob512, u64; + btreemap_v2_mem_manager_remove_u64_vec512, remove_helper_v2_mem_manager, u64, FixedVec512; + btreemap_v2_mem_manager_remove_vec512_u64, remove_helper_v2_mem_manager, FixedVec512, u64; +} + +fn remove_helper_v1() -> BenchResult { + let btree = BTreeMap::new_v1(DefaultMemoryImpl::default()); + remove_helper::(btree) } -#[bench(raw)] -pub fn btreemap_values_10mib_values() -> BenchResult { - iter_helper(200, 10 * 1024, IterType::Values) +fn remove_helper_v2() -> BenchResult { + let btree = BTreeMap::new(DefaultMemoryImpl::default()); + remove_helper::(btree) } -#[bench(raw)] -pub fn btreemap_values_rev_10mib_values() -> BenchResult { - iter_helper(200, 10 * 1024, IterType::ValuesRev) +fn remove_helper_v2_mem_manager() -> BenchResult { + let memory_manager = MemoryManager::init(DefaultMemoryImpl::default()); + let btree = BTreeMap::new(memory_manager.get(MemoryId::new(42))); + remove_helper::(btree) } -#[bench(raw)] -pub fn btreemap_iter_count_small_values() -> BenchResult { - let mut btree = BTreeMap::new(DefaultMemoryImpl::default()); - let size: u32 = 10_000; - for i in 0..size { - btree.insert(i, vec![]); +// Inserts a large number of random blobs into a btreemap, then profiles removing them. +fn remove_helper(mut btree: BTreeMap) -> BenchResult { + let count = 10_000; + let mut rng = Rng::from_seed(0); + let items = generate_random_kv::(count, &mut rng); + for (k, v) in items.clone() { + btree.insert(k, v); } + let keys: Vec = items.into_iter().map(|(k, _)| k).collect(); bench_fn(|| { - btree - .range((Bound::Included(0), Bound::Included(size))) - .count(); + // Remove the keys from the btree. + for random_key in keys { + btree.remove(&random_key); + } }) } #[bench(raw)] -pub fn btreemap_iter_count_10mib_values() -> BenchResult { +pub fn btreemap_v2_remove_10mib_values() -> BenchResult { + let count = 20; let mut btree = BTreeMap::new(DefaultMemoryImpl::default()); - - let size: u8 = 200; - - // Insert 200 10MiB values. - for i in 0..size { - btree.insert(i, vec![0u8; 10 * 1024]); + let mut rng = Rng::from_seed(0); + let values = generate_random_blocks(count, 10 * MiB, &mut rng); + for (i, value) in values.into_iter().enumerate() { + btree.insert(i as u32, value); } bench_fn(|| { - btree - .range((Bound::Included(0), Bound::Included(size))) - .count(); + for i in 0..count { + btree.remove(&(i as u32)); + } }) } -// Profiles inserting a large number of random blobs into a btreemap. -fn insert_helper_v1() -> BenchResult { +// Benchmarks for `BTreeMap::get`. +bench_tests! { + // === V1 === + + // V1 blob K x 128 + btreemap_v1_get_blob_4_128, get_helper_v1, Blob4, Blob128; + btreemap_v1_get_blob_8_128, get_helper_v1, Blob8, Blob128; + btreemap_v1_get_blob_16_128, get_helper_v1, Blob16, Blob128; + btreemap_v1_get_blob_32_128, get_helper_v1, Blob32, Blob128; + btreemap_v1_get_blob_64_128, get_helper_v1, Blob64, Blob128; + btreemap_v1_get_blob_128_128, get_helper_v1, Blob128, Blob128; + btreemap_v1_get_blob_256_128, get_helper_v1, Blob256, Blob128; + btreemap_v1_get_blob_512_128, get_helper_v1, Blob512, Blob128; + btreemap_v1_get_blob_1024_128, get_helper_v1, Blob1024, Blob128; + + // V1 blob 32 x V + btreemap_v1_get_blob_32_4, get_helper_v1, Blob32, Blob4; + btreemap_v1_get_blob_32_8, get_helper_v1, Blob32, Blob8; + btreemap_v1_get_blob_32_16, get_helper_v1, Blob32, Blob16; + btreemap_v1_get_blob_32_32, get_helper_v1, Blob32, Blob32; + btreemap_v1_get_blob_32_64, get_helper_v1, Blob32, Blob64; + //btreemap_v1_get_blob_32_128, get_helper_v1, Blob32, Blob128; + btreemap_v1_get_blob_32_256, get_helper_v1, Blob32, Blob256; + btreemap_v1_get_blob_32_512, get_helper_v1, Blob32, Blob512; + btreemap_v1_get_blob_32_1024, get_helper_v1, Blob32, Blob1024; + + // V1 u64 / blob8 + btreemap_v1_get_u64_u64, get_helper_v1, u64, u64; + btreemap_v1_get_u64_blob8, get_helper_v1, u64, Blob8; + btreemap_v1_get_blob8_u64, get_helper_v1, Blob8, u64; + + // === V2 === + + // V2 blob K x 128 + btreemap_v2_get_blob_4_128, get_helper_v2, Blob4, Blob128; + btreemap_v2_get_blob_8_128, get_helper_v2, Blob8, Blob128; + btreemap_v2_get_blob_16_128, get_helper_v2, Blob16, Blob128; + btreemap_v2_get_blob_32_128, get_helper_v2, Blob32, Blob128; + btreemap_v2_get_blob_64_128, get_helper_v2, Blob64, Blob128; + btreemap_v2_get_blob_128_128, get_helper_v2, Blob128, Blob128; + btreemap_v2_get_blob_256_128, get_helper_v2, Blob256, Blob128; + btreemap_v2_get_blob_512_128, get_helper_v2, Blob512, Blob128; + btreemap_v2_get_blob_1024_128, get_helper_v2, Blob1024, Blob128; + + // V2 blob 32 x V + btreemap_v2_get_blob_32_4, get_helper_v2, Blob32, Blob4; + btreemap_v2_get_blob_32_8, get_helper_v2, Blob32, Blob8; + btreemap_v2_get_blob_32_16, get_helper_v2, Blob32, Blob16; + btreemap_v2_get_blob_32_32, get_helper_v2, Blob32, Blob32; + btreemap_v2_get_blob_32_64, get_helper_v2, Blob32, Blob64; + //btreemap_v2_get_blob_32_128, get_helper_v2, Blob32, Blob128; + btreemap_v2_get_blob_32_256, get_helper_v2, Blob32, Blob256; + btreemap_v2_get_blob_32_512, get_helper_v2, Blob32, Blob512; + btreemap_v2_get_blob_32_1024, get_helper_v2, Blob32, Blob1024; + + // V2 vec K x 128 + btreemap_v2_get_vec_4_128, get_helper_v2, FixedVec4, FixedVec128; + btreemap_v2_get_vec_8_128, get_helper_v2, FixedVec8, FixedVec128; + btreemap_v2_get_vec_16_128, get_helper_v2, FixedVec16, FixedVec128; + btreemap_v2_get_vec_32_128, get_helper_v2, FixedVec32, FixedVec128; + btreemap_v2_get_vec_64_128, get_helper_v2, FixedVec64, FixedVec128; + btreemap_v2_get_vec_128_128, get_helper_v2, FixedVec128, FixedVec128; + btreemap_v2_get_vec_256_128, get_helper_v2, FixedVec256, FixedVec128; + btreemap_v2_get_vec_512_128, get_helper_v2, FixedVec512, FixedVec128; + btreemap_v2_get_vec_1024_128, get_helper_v2, FixedVec1024, FixedVec128; + + // V2 vec 32 x V + btreemap_v2_get_vec_32_4, get_helper_v2, FixedVec32, FixedVec4; + btreemap_v2_get_vec_32_8, get_helper_v2, FixedVec32, FixedVec8; + btreemap_v2_get_vec_32_16, get_helper_v2, FixedVec32, FixedVec16; + btreemap_v2_get_vec_32_32, get_helper_v2, FixedVec32, FixedVec32; + btreemap_v2_get_vec_32_64, get_helper_v2, FixedVec32, FixedVec64; + //btreemap_v2_get_vec_32_128, get_helper_v2, FixedVec32, FixedVec128; + btreemap_v2_get_vec_32_256, get_helper_v2, FixedVec32, FixedVec256; + btreemap_v2_get_vec_32_512, get_helper_v2, FixedVec32, FixedVec512; + btreemap_v2_get_vec_32_1024, get_helper_v2, FixedVec32, FixedVec1024; + + // V2 u64 / blob8 / vec8 + btreemap_v2_get_u64_u64, get_helper_v2, u64, u64; + btreemap_v2_get_u64_blob8, get_helper_v2, u64, Blob8; + btreemap_v2_get_blob8_u64, get_helper_v2, Blob8, u64; + btreemap_v2_get_u64_vec8, get_helper_v2, u64, FixedVec8; + btreemap_v2_get_vec8_u64, get_helper_v2, FixedVec8, u64; + + // V2 memory manager u64 / blob512 / vec512 + btreemap_v2_mem_manager_get_u64_u64, get_helper_v2_mem_manager, u64, u64; + btreemap_v2_mem_manager_get_u64_blob512, get_helper_v2_mem_manager, u64, Blob512; + btreemap_v2_mem_manager_get_blob512_u64, get_helper_v2_mem_manager, Blob512, u64; + btreemap_v2_mem_manager_get_u64_vec512, get_helper_v2_mem_manager, u64, FixedVec512; + btreemap_v2_mem_manager_get_vec512_u64, get_helper_v2_mem_manager, FixedVec512, u64; +} + +fn get_helper_v1() -> BenchResult { let btree = BTreeMap::new_v1(DefaultMemoryImpl::default()); - insert_helper::(btree) + get_helper::(btree) } -fn insert_helper_v2() -> BenchResult { +fn get_helper_v2() -> BenchResult { let btree = BTreeMap::new(DefaultMemoryImpl::default()); - insert_helper::(btree) + get_helper::(btree) } -fn insert_helper_v2_mem_manager( -) -> BenchResult { +fn get_helper_v2_mem_manager() -> BenchResult { let memory_manager = MemoryManager::init(DefaultMemoryImpl::default()); let btree = BTreeMap::new(memory_manager.get(MemoryId::new(42))); - insert_helper::(btree) + get_helper::(btree) } -// Profiles inserting a large number of random blobs into a btreemap. -fn insert_helper( - mut btree: BTreeMap, -) -> BenchResult { - let num_keys = 10_000; +// Profiles getting a large number of random blobs from a btreemap. +fn get_helper(mut btree: BTreeMap) -> BenchResult { + let count = 10_000; let mut rng = Rng::from_seed(0); - let mut random_keys = Vec::with_capacity(num_keys); - let mut random_values = Vec::with_capacity(num_keys); - - for _ in 0..num_keys { - random_keys.push(K::random(&mut rng)); - random_values.push(V::random(&mut rng)); + let items = generate_random_kv::(count, &mut rng); + for (k, v) in items.clone() { + btree.insert(k, v); } + let keys: Vec = items.into_iter().map(|(k, _)| k).collect(); bench_fn(|| { - // Insert the keys into the btree. - for (k, v) in random_keys.into_iter().zip(random_values.into_iter()) { - btree.insert(k, v); + // Get all the keys from the map. + for random_key in keys { + btree.get(&random_key); } }) } -// Profiles iterating over a btreemap. -fn iter_helper(size: u32, value_size: u32, iter_type: IterType) -> BenchResult { +#[bench(raw)] +pub fn btreemap_v2_get_10mib_values() -> BenchResult { + let count = 20; let mut btree = BTreeMap::new(DefaultMemoryImpl::default()); - for i in 0..size { - btree.insert(i, vec![0u8; value_size as usize]); + let mut rng = Rng::from_seed(0); + let values = generate_random_blocks(count, 10 * MiB, &mut rng); + for (i, value) in values.into_iter().enumerate() { + btree.insert(i as u32, value); } - match iter_type { - IterType::Iter => bench_fn(|| for _ in btree.iter() {}), - IterType::IterRev => bench_fn(|| for _ in btree.iter().rev() {}), - IterType::Keys => bench_fn(|| for _ in btree.keys() {}), - IterType::KeysRev => bench_fn(|| for _ in btree.keys().rev() {}), - IterType::Values => bench_fn(|| for _ in btree.values() {}), - IterType::ValuesRev => bench_fn(|| for _ in btree.values().rev() {}), - } + bench_fn(|| { + for i in 0..count { + btree.get(&(i as u32)); + } + }) } -// Profiles getting a large number of random blobs from a btreemap. -fn get_helper_v1() -> BenchResult { +// Benchmarks for `BTreeMap::contains_key`. +bench_tests! { + // === V1 === + + // V1 blob K x 128 + btreemap_v1_contains_blob_4_128, contains_helper_v1, Blob4, Blob128; + btreemap_v1_contains_blob_8_128, contains_helper_v1, Blob8, Blob128; + btreemap_v1_contains_blob_16_128, contains_helper_v1, Blob16, Blob128; + btreemap_v1_contains_blob_32_128, contains_helper_v1, Blob32, Blob128; + btreemap_v1_contains_blob_64_128, contains_helper_v1, Blob64, Blob128; + btreemap_v1_contains_blob_128_128, contains_helper_v1, Blob128, Blob128; + btreemap_v1_contains_blob_256_128, contains_helper_v1, Blob256, Blob128; + btreemap_v1_contains_blob_512_128, contains_helper_v1, Blob512, Blob128; + btreemap_v1_contains_blob_1024_128, contains_helper_v1, Blob1024, Blob128; + + // V1 blob 32 x V + btreemap_v1_contains_blob_32_4, contains_helper_v1, Blob32, Blob4; + btreemap_v1_contains_blob_32_8, contains_helper_v1, Blob32, Blob8; + btreemap_v1_contains_blob_32_16, contains_helper_v1, Blob32, Blob16; + btreemap_v1_contains_blob_32_32, contains_helper_v1, Blob32, Blob32; + btreemap_v1_contains_blob_32_64, contains_helper_v1, Blob32, Blob64; + //btreemap_v1_contains_blob_32_128, contains_helper_v1, Blob32, Blob128; + btreemap_v1_contains_blob_32_256, contains_helper_v1, Blob32, Blob256; + btreemap_v1_contains_blob_32_512, contains_helper_v1, Blob32, Blob512; + btreemap_v1_contains_blob_32_1024, contains_helper_v1, Blob32, Blob1024; + + // V1 u64 / blob8 + btreemap_v1_contains_u64_u64, contains_helper_v1, u64, u64; + btreemap_v1_contains_u64_blob8, contains_helper_v1, u64, Blob8; + btreemap_v1_contains_blob8_u64, contains_helper_v1, Blob8, u64; + + // === V2 === + + // V2 blob K x 128 + btreemap_v2_contains_blob_4_128, contains_helper_v2, Blob4, Blob128; + btreemap_v2_contains_blob_8_128, contains_helper_v2, Blob8, Blob128; + btreemap_v2_contains_blob_16_128, contains_helper_v2, Blob16, Blob128; + btreemap_v2_contains_blob_32_128, contains_helper_v2, Blob32, Blob128; + btreemap_v2_contains_blob_64_128, contains_helper_v2, Blob64, Blob128; + btreemap_v2_contains_blob_128_128, contains_helper_v2, Blob128, Blob128; + btreemap_v2_contains_blob_256_128, contains_helper_v2, Blob256, Blob128; + btreemap_v2_contains_blob_512_128, contains_helper_v2, Blob512, Blob128; + btreemap_v2_contains_blob_1024_128, contains_helper_v2, Blob1024, Blob128; + + // V2 blob 32 x V + btreemap_v2_contains_blob_32_4, contains_helper_v2, Blob32, Blob4; + btreemap_v2_contains_blob_32_8, contains_helper_v2, Blob32, Blob8; + btreemap_v2_contains_blob_32_16, contains_helper_v2, Blob32, Blob16; + btreemap_v2_contains_blob_32_32, contains_helper_v2, Blob32, Blob32; + btreemap_v2_contains_blob_32_64, contains_helper_v2, Blob32, Blob64; + //btreemap_v2_contains_blob_32_128, contains_helper_v2, Blob32, Blob128; + btreemap_v2_contains_blob_32_256, contains_helper_v2, Blob32, Blob256; + btreemap_v2_contains_blob_32_512, contains_helper_v2, Blob32, Blob512; + btreemap_v2_contains_blob_32_1024, contains_helper_v2, Blob32, Blob1024; + + // V2 vec K x 128 + btreemap_v2_contains_vec_4_128, contains_helper_v2, FixedVec4, FixedVec128; + btreemap_v2_contains_vec_8_128, contains_helper_v2, FixedVec8, FixedVec128; + btreemap_v2_contains_vec_16_128, contains_helper_v2, FixedVec16, FixedVec128; + btreemap_v2_contains_vec_32_128, contains_helper_v2, FixedVec32, FixedVec128; + btreemap_v2_contains_vec_64_128, contains_helper_v2, FixedVec64, FixedVec128; + btreemap_v2_contains_vec_128_128, contains_helper_v2, FixedVec128, FixedVec128; + btreemap_v2_contains_vec_256_128, contains_helper_v2, FixedVec256, FixedVec128; + btreemap_v2_contains_vec_512_128, contains_helper_v2, FixedVec512, FixedVec128; + btreemap_v2_contains_vec_1024_128, contains_helper_v2, FixedVec1024, FixedVec128; + + // V2 vec 32 x V + btreemap_v2_contains_vec_32_4, contains_helper_v2, FixedVec32, FixedVec4; + btreemap_v2_contains_vec_32_8, contains_helper_v2, FixedVec32, FixedVec8; + btreemap_v2_contains_vec_32_16, contains_helper_v2, FixedVec32, FixedVec16; + btreemap_v2_contains_vec_32_32, contains_helper_v2, FixedVec32, FixedVec32; + btreemap_v2_contains_vec_32_64, contains_helper_v2, FixedVec32, FixedVec64; + //btreemap_v2_contains_vec_32_128, contains_helper_v2, FixedVec32, FixedVec128; + btreemap_v2_contains_vec_32_256, contains_helper_v2, FixedVec32, FixedVec256; + btreemap_v2_contains_vec_32_512, contains_helper_v2, FixedVec32, FixedVec512; + btreemap_v2_contains_vec_32_1024, contains_helper_v2, FixedVec32, FixedVec1024; + + // V2 u64 / blob8 / vec8 + btreemap_v2_contains_u64_u64, contains_helper_v2, u64, u64; + btreemap_v2_contains_u64_blob8, contains_helper_v2, u64, Blob8; + btreemap_v2_contains_blob8_u64, contains_helper_v2, Blob8, u64; + btreemap_v2_contains_u64_vec8, contains_helper_v2, u64, FixedVec8; + btreemap_v2_contains_vec8_u64, contains_helper_v2, FixedVec8, u64; + + // V2 memory manager u64 / blob512 / vec512 + btreemap_v2_mem_manager_contains_u64_u64, contains_helper_v2_mem_manager, u64, u64; + btreemap_v2_mem_manager_contains_u64_blob512, contains_helper_v2_mem_manager, u64, Blob512; + btreemap_v2_mem_manager_contains_blob512_u64, contains_helper_v2_mem_manager, Blob512, u64; + btreemap_v2_mem_manager_contains_u64_vec512, contains_helper_v2_mem_manager, u64, FixedVec512; + btreemap_v2_mem_manager_contains_vec512_u64, contains_helper_v2_mem_manager, FixedVec512, u64; +} + +fn contains_helper_v1() -> BenchResult { let btree = BTreeMap::new_v1(DefaultMemoryImpl::default()); - get_helper::(btree) + contains_helper::(btree) } -fn get_helper_v2() -> BenchResult { +fn contains_helper_v2() -> BenchResult { let btree = BTreeMap::new(DefaultMemoryImpl::default()); - get_helper::(btree) + contains_helper::(btree) } -fn get_helper_v2_mem_manager( -) -> BenchResult { +fn contains_helper_v2_mem_manager() -> BenchResult { let memory_manager = MemoryManager::init(DefaultMemoryImpl::default()); let btree = BTreeMap::new(memory_manager.get(MemoryId::new(42))); - get_helper::(btree) + contains_helper::(btree) } -fn get_helper( +// Profiles `contains_key` on a large number of random blobs from a btreemap. +fn contains_helper( mut btree: BTreeMap, ) -> BenchResult { - let num_keys = 10_000; + let count = 10_000; let mut rng = Rng::from_seed(0); - let mut random_keys = Vec::with_capacity(num_keys); - let mut random_values = Vec::with_capacity(num_keys); - - for _ in 0..num_keys { - random_keys.push(K::random(&mut rng)); - random_values.push(V::random(&mut rng)); + let items = generate_random_kv::(count, &mut rng); + for (k, v) in items.clone() { + btree.insert(k, v); } - // Insert the keys into the btree. - for (k, v) in random_keys.iter().zip(random_values.into_iter()) { - btree.insert(k.clone(), v); + let keys: Vec = items.into_iter().map(|(k, _)| k).collect(); + bench_fn(|| { + // Checks if the keys are in the map. + for random_key in keys { + btree.contains_key(&random_key); + } + }) +} + +#[bench(raw)] +pub fn btreemap_v2_contains_10mib_values() -> BenchResult { + let count = 20; + let mut btree = BTreeMap::new(DefaultMemoryImpl::default()); + let mut rng = Rng::from_seed(0); + let values = generate_random_blocks(count, 10 * MiB, &mut rng); + for (i, value) in values.into_iter().enumerate() { + btree.insert(i as u32, value); } - // Get all the keys from the map. bench_fn(|| { - for k in random_keys.into_iter() { - btree.get(&k).unwrap(); + for i in 0..count { + btree.contains_key(&(i as u32)); } }) } -// Profiles `contains_key` on a large number of random blobs from a btreemap. -fn contains_key_helper_v1() -> BenchResult -{ +/// Helper macro to generate traversal benchmarks. +macro_rules! bench_traversal_tests { + ( + $( + $fn_name:ident, + $helper:ident, + $count:expr, + $value_size:expr, + $traversal_mode:expr + );+ $(;)? + ) => { + $( + #[bench(raw)] + pub fn $fn_name() -> BenchResult { + $helper($count, $value_size, $traversal_mode) + } + )+ + }; +} + +// First +bench_tests! { + // === V1 === + + // V1 blob K x 128 + btreemap_v1_pop_first_blob_4_128, pop_first_helper_v1, Blob4, Blob128; + btreemap_v1_pop_first_blob_8_128, pop_first_helper_v1, Blob8, Blob128; + btreemap_v1_pop_first_blob_16_128, pop_first_helper_v1, Blob16, Blob128; + btreemap_v1_pop_first_blob_32_128, pop_first_helper_v1, Blob32, Blob128; + btreemap_v1_pop_first_blob_64_128, pop_first_helper_v1, Blob64, Blob128; + btreemap_v1_pop_first_blob_128_128, pop_first_helper_v1, Blob128, Blob128; + btreemap_v1_pop_first_blob_256_128, pop_first_helper_v1, Blob256, Blob128; + btreemap_v1_pop_first_blob_512_128, pop_first_helper_v1, Blob512, Blob128; + btreemap_v1_pop_first_blob_1024_128, pop_first_helper_v1, Blob1024, Blob128; + + // V1 blob 32 x V + btreemap_v1_pop_first_blob_32_4, pop_first_helper_v1, Blob32, Blob4; + btreemap_v1_pop_first_blob_32_8, pop_first_helper_v1, Blob32, Blob8; + btreemap_v1_pop_first_blob_32_16, pop_first_helper_v1, Blob32, Blob16; + btreemap_v1_pop_first_blob_32_32, pop_first_helper_v1, Blob32, Blob32; + btreemap_v1_pop_first_blob_32_64, pop_first_helper_v1, Blob32, Blob64; + //btreemap_v1_pop_first_blob_32_128, pop_first_helper_v1, Blob32, Blob128; + btreemap_v1_pop_first_blob_32_256, pop_first_helper_v1, Blob32, Blob256; + btreemap_v1_pop_first_blob_32_512, pop_first_helper_v1, Blob32, Blob512; + btreemap_v1_pop_first_blob_32_1024, pop_first_helper_v1, Blob32, Blob1024; + + // V1 u64 / blob8 + btreemap_v1_pop_first_u64_u64, pop_first_helper_v1, u64, u64; + btreemap_v1_pop_first_u64_blob8, pop_first_helper_v1, u64, Blob8; + btreemap_v1_pop_first_blob8_u64, pop_first_helper_v1, Blob8, u64; + + // === V2 === + + // V2 blob K x 128 + btreemap_v2_pop_first_blob_4_128, pop_first_helper_v2, Blob4, Blob128; + btreemap_v2_pop_first_blob_8_128, pop_first_helper_v2, Blob8, Blob128; + btreemap_v2_pop_first_blob_16_128, pop_first_helper_v2, Blob16, Blob128; + btreemap_v2_pop_first_blob_32_128, pop_first_helper_v2, Blob32, Blob128; + btreemap_v2_pop_first_blob_64_128, pop_first_helper_v2, Blob64, Blob128; + btreemap_v2_pop_first_blob_128_128, pop_first_helper_v2, Blob128, Blob128; + btreemap_v2_pop_first_blob_256_128, pop_first_helper_v2, Blob256, Blob128; + btreemap_v2_pop_first_blob_512_128, pop_first_helper_v2, Blob512, Blob128; + btreemap_v2_pop_first_blob_1024_128, pop_first_helper_v2, Blob1024, Blob128; + + // V2 blob 32 x V + btreemap_v2_pop_first_blob_32_4, pop_first_helper_v2, Blob32, Blob4; + btreemap_v2_pop_first_blob_32_8, pop_first_helper_v2, Blob32, Blob8; + btreemap_v2_pop_first_blob_32_16, pop_first_helper_v2, Blob32, Blob16; + btreemap_v2_pop_first_blob_32_32, pop_first_helper_v2, Blob32, Blob32; + btreemap_v2_pop_first_blob_32_64, pop_first_helper_v2, Blob32, Blob64; + //btreemap_v2_pop_first_blob_32_128, pop_first_helper_v2, Blob32, Blob128; + btreemap_v2_pop_first_blob_32_256, pop_first_helper_v2, Blob32, Blob256; + btreemap_v2_pop_first_blob_32_512, pop_first_helper_v2, Blob32, Blob512; + btreemap_v2_pop_first_blob_32_1024, pop_first_helper_v2, Blob32, Blob1024; + + // V2 vec K x 128 + btreemap_v2_pop_first_vec_4_128, pop_first_helper_v2, FixedVec4, FixedVec128; + btreemap_v2_pop_first_vec_8_128, pop_first_helper_v2, FixedVec8, FixedVec128; + btreemap_v2_pop_first_vec_16_128, pop_first_helper_v2, FixedVec16, FixedVec128; + btreemap_v2_pop_first_vec_32_128, pop_first_helper_v2, FixedVec32, FixedVec128; + btreemap_v2_pop_first_vec_64_128, pop_first_helper_v2, FixedVec64, FixedVec128; + btreemap_v2_pop_first_vec_128_128, pop_first_helper_v2, FixedVec128, FixedVec128; + btreemap_v2_pop_first_vec_256_128, pop_first_helper_v2, FixedVec256, FixedVec128; + btreemap_v2_pop_first_vec_512_128, pop_first_helper_v2, FixedVec512, FixedVec128; + btreemap_v2_pop_first_vec_1024_128, pop_first_helper_v2, FixedVec1024, FixedVec128; + + // V2 vec 32 x V + btreemap_v2_pop_first_vec_32_4, pop_first_helper_v2, FixedVec32, FixedVec4; + btreemap_v2_pop_first_vec_32_8, pop_first_helper_v2, FixedVec32, FixedVec8; + btreemap_v2_pop_first_vec_32_16, pop_first_helper_v2, FixedVec32, FixedVec16; + btreemap_v2_pop_first_vec_32_32, pop_first_helper_v2, FixedVec32, FixedVec32; + btreemap_v2_pop_first_vec_32_64, pop_first_helper_v2, FixedVec32, FixedVec64; + //btreemap_v2_pop_first_vec_32_128, pop_first_helper_v2, FixedVec32, FixedVec128; + btreemap_v2_pop_first_vec_32_256, pop_first_helper_v2, FixedVec32, FixedVec256; + btreemap_v2_pop_first_vec_32_512, pop_first_helper_v2, FixedVec32, FixedVec512; + btreemap_v2_pop_first_vec_32_1024, pop_first_helper_v2, FixedVec32, FixedVec1024; + + // V2 u64 / blob8 / vec8 + btreemap_v2_pop_first_u64_u64, pop_first_helper_v2, u64, u64; + btreemap_v2_pop_first_u64_blob8, pop_first_helper_v2, u64, Blob8; + btreemap_v2_pop_first_blob8_u64, pop_first_helper_v2, Blob8, u64; + btreemap_v2_pop_first_u64_vec8, pop_first_helper_v2, u64, FixedVec8; + btreemap_v2_pop_first_vec8_u64, pop_first_helper_v2, FixedVec8, u64; +} + +// Last +bench_tests! { + // === V1 === + + // V1 blob K x 128 + btreemap_v1_pop_last_blob_4_128, pop_last_helper_v1, Blob4, Blob128; + btreemap_v1_pop_last_blob_8_128, pop_last_helper_v1, Blob8, Blob128; + btreemap_v1_pop_last_blob_16_128, pop_last_helper_v1, Blob16, Blob128; + btreemap_v1_pop_last_blob_32_128, pop_last_helper_v1, Blob32, Blob128; + btreemap_v1_pop_last_blob_64_128, pop_last_helper_v1, Blob64, Blob128; + btreemap_v1_pop_last_blob_128_128, pop_last_helper_v1, Blob128, Blob128; + btreemap_v1_pop_last_blob_256_128, pop_last_helper_v1, Blob256, Blob128; + btreemap_v1_pop_last_blob_512_128, pop_last_helper_v1, Blob512, Blob128; + btreemap_v1_pop_last_blob_1024_128, pop_last_helper_v1, Blob1024, Blob128; + + // V1 blob 32 x V + btreemap_v1_pop_last_blob_32_4, pop_last_helper_v1, Blob32, Blob4; + btreemap_v1_pop_last_blob_32_8, pop_last_helper_v1, Blob32, Blob8; + btreemap_v1_pop_last_blob_32_16, pop_last_helper_v1, Blob32, Blob16; + btreemap_v1_pop_last_blob_32_32, pop_last_helper_v1, Blob32, Blob32; + btreemap_v1_pop_last_blob_32_64, pop_last_helper_v1, Blob32, Blob64; + //btreemap_v1_pop_last_blob_32_128, pop_last_helper_v1, Blob32, Blob128; + btreemap_v1_pop_last_blob_32_256, pop_last_helper_v1, Blob32, Blob256; + btreemap_v1_pop_last_blob_32_512, pop_last_helper_v1, Blob32, Blob512; + btreemap_v1_pop_last_blob_32_1024, pop_last_helper_v1, Blob32, Blob1024; + + // V1 u64 / blob8 + btreemap_v1_pop_last_u64_u64, pop_last_helper_v1, u64, u64; + btreemap_v1_pop_last_u64_blob8, pop_last_helper_v1, u64, Blob8; + btreemap_v1_pop_last_blob8_u64, pop_last_helper_v1, Blob8, u64; + + // === V2 === + + // V2 blob K x 128 + btreemap_v2_pop_last_blob_4_128, pop_last_helper_v2, Blob4, Blob128; + btreemap_v2_pop_last_blob_8_128, pop_last_helper_v2, Blob8, Blob128; + btreemap_v2_pop_last_blob_16_128, pop_last_helper_v2, Blob16, Blob128; + btreemap_v2_pop_last_blob_32_128, pop_last_helper_v2, Blob32, Blob128; + btreemap_v2_pop_last_blob_64_128, pop_last_helper_v2, Blob64, Blob128; + btreemap_v2_pop_last_blob_128_128, pop_last_helper_v2, Blob128, Blob128; + btreemap_v2_pop_last_blob_256_128, pop_last_helper_v2, Blob256, Blob128; + btreemap_v2_pop_last_blob_512_128, pop_last_helper_v2, Blob512, Blob128; + btreemap_v2_pop_last_blob_1024_128, pop_last_helper_v2, Blob1024, Blob128; + + // V2 blob 32 x V + btreemap_v2_pop_last_blob_32_4, pop_last_helper_v2, Blob32, Blob4; + btreemap_v2_pop_last_blob_32_8, pop_last_helper_v2, Blob32, Blob8; + btreemap_v2_pop_last_blob_32_16, pop_last_helper_v2, Blob32, Blob16; + btreemap_v2_pop_last_blob_32_32, pop_last_helper_v2, Blob32, Blob32; + btreemap_v2_pop_last_blob_32_64, pop_last_helper_v2, Blob32, Blob64; + //btreemap_v2_pop_last_blob_32_128, pop_last_helper_v2, Blob32, Blob128; + btreemap_v2_pop_last_blob_32_256, pop_last_helper_v2, Blob32, Blob256; + btreemap_v2_pop_last_blob_32_512, pop_last_helper_v2, Blob32, Blob512; + btreemap_v2_pop_last_blob_32_1024, pop_last_helper_v2, Blob32, Blob1024; + + // V2 vec K x 128 + btreemap_v2_pop_last_vec_4_128, pop_last_helper_v2, FixedVec4, FixedVec128; + btreemap_v2_pop_last_vec_8_128, pop_last_helper_v2, FixedVec8, FixedVec128; + btreemap_v2_pop_last_vec_16_128, pop_last_helper_v2, FixedVec16, FixedVec128; + btreemap_v2_pop_last_vec_32_128, pop_last_helper_v2, FixedVec32, FixedVec128; + btreemap_v2_pop_last_vec_64_128, pop_last_helper_v2, FixedVec64, FixedVec128; + btreemap_v2_pop_last_vec_128_128, pop_last_helper_v2, FixedVec128, FixedVec128; + btreemap_v2_pop_last_vec_256_128, pop_last_helper_v2, FixedVec256, FixedVec128; + btreemap_v2_pop_last_vec_512_128, pop_last_helper_v2, FixedVec512, FixedVec128; + btreemap_v2_pop_last_vec_1024_128, pop_last_helper_v2, FixedVec1024, FixedVec128; + + // V2 vec 32 x V + btreemap_v2_pop_last_vec_32_4, pop_last_helper_v2, FixedVec32, FixedVec4; + btreemap_v2_pop_last_vec_32_8, pop_last_helper_v2, FixedVec32, FixedVec8; + btreemap_v2_pop_last_vec_32_16, pop_last_helper_v2, FixedVec32, FixedVec16; + btreemap_v2_pop_last_vec_32_32, pop_last_helper_v2, FixedVec32, FixedVec32; + btreemap_v2_pop_last_vec_32_64, pop_last_helper_v2, FixedVec32, FixedVec64; + //btreemap_v2_pop_last_vec_32_128, pop_last_helper_v2, FixedVec32, FixedVec128; + btreemap_v2_pop_last_vec_32_256, pop_last_helper_v2, FixedVec32, FixedVec256; + btreemap_v2_pop_last_vec_32_512, pop_last_helper_v2, FixedVec32, FixedVec512; + btreemap_v2_pop_last_vec_32_1024, pop_last_helper_v2, FixedVec32, FixedVec1024; + + // V2 u64 / blob8 / vec8 + btreemap_v2_pop_last_u64_u64, pop_last_helper_v2, u64, u64; + btreemap_v2_pop_last_u64_blob8, pop_last_helper_v2, u64, Blob8; + btreemap_v2_pop_last_blob8_u64, pop_last_helper_v2, Blob8, u64; + btreemap_v2_pop_last_u64_vec8, pop_last_helper_v2, u64, FixedVec8; + btreemap_v2_pop_last_vec8_u64, pop_last_helper_v2, FixedVec8, u64; +} + +fn pop_first_helper_v1() -> BenchResult { + pop_helper_v1::(Position::First) +} + +fn pop_last_helper_v1() -> BenchResult { + pop_helper_v1::(Position::Last) +} + +fn pop_first_helper_v2() -> BenchResult { + pop_helper_v2::(Position::First) +} + +fn pop_last_helper_v2() -> BenchResult { + pop_helper_v2::(Position::Last) +} + +fn pop_helper_v1(position: Position) -> BenchResult { let btree = BTreeMap::new_v1(DefaultMemoryImpl::default()); - contains_key_helper::(btree) + pop_helper::(btree, position) } -fn contains_key_helper_v2() -> BenchResult -{ +fn pop_helper_v2(position: Position) -> BenchResult { let btree = BTreeMap::new(DefaultMemoryImpl::default()); - contains_key_helper::(btree) + pop_helper::(btree, position) } -fn contains_key_helper( +enum Position { + First, + Last, +} + +fn pop_helper( mut btree: BTreeMap, + position: Position, ) -> BenchResult { - let num_keys = 10_000; + let count = 10_000; let mut rng = Rng::from_seed(0); - let mut random_keys = Vec::with_capacity(num_keys); - let mut random_values = Vec::with_capacity(num_keys); - - for _ in 0..num_keys { - random_keys.push(K::random(&mut rng)); - random_values.push(V::random(&mut rng)); - } - - // Insert the keys into the btree. - for (k, v) in random_keys.iter().zip(random_values.into_iter()) { - btree.insert(k.clone(), v); + let items = generate_random_kv::(count, &mut rng); + for (k, v) in items { + btree.insert(k, v); } - // Checks if the keys are in the map. bench_fn(|| { - for k in random_keys.into_iter() { - btree.contains_key(&k); + for _ in 0..count { + match position { + Position::First => btree.pop_first(), + Position::Last => btree.pop_last(), + }; } }) } -// Inserts a large number of random blobs into a btreemap, then profiles removing them. -fn remove_helper_v1() -> BenchResult { - let btree = BTreeMap::new_v1(DefaultMemoryImpl::default()); - remove_helper::(btree) +bench_traversal_tests! { + // === V1 === + // V1 does not support unbounded types, eg. Vec<_>. + + // === V2 === + // 1k items of 0 bytes + btreemap_v2_scan_iter_1k_0b, traverse_helper_v2, 1_000, 0, TraversalMode::Iter; + btreemap_v2_scan_iter_rev_1k_0b, traverse_helper_v2, 1_000, 0, TraversalMode::IterRev; + btreemap_v2_scan_keys_1k_0b, traverse_helper_v2, 1_000, 0, TraversalMode::Keys; + btreemap_v2_scan_keys_rev_1k_0b, traverse_helper_v2, 1_000, 0, TraversalMode::KeysRev; + btreemap_v2_scan_values_1k_0b, traverse_helper_v2, 1_000, 0, TraversalMode::Values; + btreemap_v2_scan_values_rev_1k_0b, traverse_helper_v2, 1_000, 0, TraversalMode::ValuesRev; + + // 1k items of 10 KiB + btreemap_v2_scan_iter_1k_10kib, traverse_helper_v2, 1_000, 10 * KiB, TraversalMode::Iter; + btreemap_v2_scan_iter_rev_1k_10kib, traverse_helper_v2, 1_000, 10 * KiB, TraversalMode::IterRev; + btreemap_v2_scan_keys_1k_10kib, traverse_helper_v2, 1_000, 10 * KiB, TraversalMode::Keys; + btreemap_v2_scan_keys_rev_1k_10kib, traverse_helper_v2, 1_000, 10 * KiB, TraversalMode::KeysRev; + btreemap_v2_scan_values_1k_10kib, traverse_helper_v2, 1_000, 10 * KiB, TraversalMode::Values; + btreemap_v2_scan_values_rev_1k_10kib, traverse_helper_v2, 1_000, 10 * KiB, TraversalMode::ValuesRev; + + // 20 items of 10 MiB + btreemap_v2_scan_iter_20_10mib, traverse_helper_v2, 20, 10 * MiB, TraversalMode::Iter; + btreemap_v2_scan_iter_rev_20_10mib, traverse_helper_v2, 20, 10 * MiB, TraversalMode::IterRev; + btreemap_v2_scan_keys_20_10mib, traverse_helper_v2, 20, 10 * MiB, TraversalMode::Keys; + btreemap_v2_scan_keys_rev_20_10mib, traverse_helper_v2, 20, 10 * MiB, TraversalMode::KeysRev; + btreemap_v2_scan_values_20_10mib, traverse_helper_v2, 20, 10 * MiB, TraversalMode::Values; + btreemap_v2_scan_values_rev_20_10mib, traverse_helper_v2, 20, 10 * MiB, TraversalMode::ValuesRev; +} + +enum TraversalMode { + Iter, + IterRev, + Keys, + KeysRev, + Values, + ValuesRev, } -fn remove_helper_v2() -> BenchResult { - let btree = BTreeMap::new(DefaultMemoryImpl::default()); - remove_helper::(btree) +/// Benchmarks BTreeMap traversal for the given traversal mode. +fn traverse_helper_v2(count: u32, value_size: usize, traversal_mode: TraversalMode) -> BenchResult { + let mut btree = BTreeMap::new(DefaultMemoryImpl::default()); + for i in 0..count { + btree.insert(i, vec![0u8; value_size]); + } + + match traversal_mode { + TraversalMode::Iter => bench_fn(|| for _ in btree.iter() {}), + TraversalMode::IterRev => bench_fn(|| for _ in btree.iter().rev() {}), + TraversalMode::Keys => bench_fn(|| for _ in btree.keys() {}), + TraversalMode::KeysRev => bench_fn(|| for _ in btree.keys().rev() {}), + TraversalMode::Values => bench_fn(|| for _ in btree.values() {}), + TraversalMode::ValuesRev => bench_fn(|| for _ in btree.values().rev() {}), + } } -fn remove_helper( - mut btree: BTreeMap, -) -> BenchResult { - let num_keys = 10_000; - let mut rng = Rng::from_seed(0); - let mut random_keys = Vec::with_capacity(num_keys); - let mut random_values = Vec::with_capacity(num_keys); +/// Helper macro to generate range benchmarks. +macro_rules! bench_range_tests { + ($( $fn_name:ident, $helper:ident, $count:expr, $size:expr );+ $(;)?) => { + $( + #[bench(raw)] + pub fn $fn_name() -> BenchResult { + $helper($count, $size) + } + )+ + }; +} + +bench_range_tests! { + // === V1 === + // V1 does not support unbounded types, eg. Vec<_>. + + // === V2 === + btreemap_v2_range_key_sum_1k_0b, range_key_sum_helper_v2, 1_000, 0; + btreemap_v2_range_key_sum_1k_10kib, range_key_sum_helper_v2, 1_000, 10 * KiB; + btreemap_v2_range_key_sum_20_10mib, range_key_sum_helper_v2, 20, 10 * MiB; + + btreemap_v2_range_value_sum_1k_0b, range_value_sum_helper_v2, 1_000, 0; + btreemap_v2_range_value_sum_1k_10kib, range_value_sum_helper_v2, 1_000, 10 * KiB; + btreemap_v2_range_value_sum_20_10mib, range_value_sum_helper_v2, 20, 10 * MiB; + + btreemap_v2_range_count_1k_0b, range_count_helper_v2, 1_000, 0; + btreemap_v2_range_count_1k_10kib, range_count_helper_v2, 1_000, 10 * KiB; + btreemap_v2_range_count_20_10mib, range_count_helper_v2, 20, 10 * MiB; +} - for _ in 0..num_keys { - random_keys.push(K::random(&mut rng)); - random_values.push(V::random(&mut rng)); +fn range_key_sum_helper_v2(count: usize, size: usize) -> BenchResult { + let mut btree = BTreeMap::new(DefaultMemoryImpl::default()); + let mut rng = Rng::from_seed(0); + let values = generate_random_blocks(count, size, &mut rng); + for (i, value) in values.into_iter().enumerate() { + btree.insert(i as u32, value); } - // Insert the keys into the btree. - for (k, v) in random_keys.iter().zip(random_values.into_iter()) { - btree.insert(k.clone(), v); + // Read a range of entries but only process the key of each entry. + bench_fn(|| { + btree + .range((Bound::Included(0), Bound::Included(size as u32))) + .map(|(k, _)| k) + .sum::() + }) +} + +fn range_value_sum_helper_v2(count: usize, size: usize) -> BenchResult { + let mut btree = BTreeMap::new(DefaultMemoryImpl::default()); + let mut rng = Rng::from_seed(0); + let values = generate_random_blocks(count, size, &mut rng); + for (i, value) in values.into_iter().enumerate() { + btree.insert(i as u32, value); } + // Read a range of entries but only process the value from every third entry. bench_fn(|| { - // Remove the keys from the btree. - for k in random_keys.into_iter() { - btree.remove(&k); - } + btree + .range((Bound::Included(0), Bound::Included(size as u32))) + .filter(|(k, _)| k % 3 == 0) + .map(|(_, v)| v.len()) + .sum::() }) } -enum IterType { - Iter, - IterRev, - Keys, - KeysRev, - Values, - ValuesRev, +fn range_count_helper_v2(count: usize, size: usize) -> BenchResult { + let mut btree = BTreeMap::new(DefaultMemoryImpl::default()); + let mut rng = Rng::from_seed(0); + let values = generate_random_blocks(count, size, &mut rng); + for (i, value) in values.into_iter().enumerate() { + btree.insert(i as u32, value); + } + + bench_fn(|| { + btree + .range((Bound::Included(0), Bound::Included(size as u32))) + .count() + }) } diff --git a/benchmarks/src/main.rs b/benchmarks/src/main.rs index 723976b5..93f2b86a 100644 --- a/benchmarks/src/main.rs +++ b/benchmarks/src/main.rs @@ -1,4 +1,4 @@ -use ic_stable_structures::storable::{Blob, Storable}; +use ic_stable_structures::storable::{Blob, FixedVec, Storable}; use tiny_rng::{Rand, Rng}; mod btreemap; @@ -22,6 +22,17 @@ impl Random for Blob { } } +impl Random for FixedVec { + fn random(rng: &mut Rng) -> Self { + let size = rng.rand_u32() % Self::max_size(); + let mut buf = Vec::with_capacity(size as usize); + for _ in 0..size { + buf.push(rng.rand_u8()); + } + FixedVec::from(&buf) + } +} + impl Random for u64 { fn random(rng: &mut Rng) -> Self { rng.rand_u64() diff --git a/canbench_results.yml b/canbench_results.yml index fd1265e1..72c4e786 100644 --- a/canbench_results.yml +++ b/canbench_results.yml @@ -1,631 +1,2431 @@ benches: - btreemap_contains_key_blob_4_1024: + btreemap_v1_contains_blob8_u64: total: - instructions: 166001914 + instructions: 192404980 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_contains_key_blob_4_1024_v2: + btreemap_v1_contains_blob_1024_128: total: - instructions: 246601950 + instructions: 4841087105 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_get_blob_128_1024: + btreemap_v1_contains_blob_128_128: total: - instructions: 871377876 + instructions: 848576334 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_get_blob_128_1024_v2: + btreemap_v1_contains_blob_16_128: total: - instructions: 952392232 + instructions: 229783109 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_get_blob_16_1024: + btreemap_v1_contains_blob_256_128: total: - instructions: 246862999 + instructions: 1405955072 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_get_blob_16_1024_v2: + btreemap_v1_contains_blob_32_1024: total: - instructions: 322886246 + instructions: 260366378 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_get_blob_256_1024: + btreemap_v1_contains_blob_32_128: total: - instructions: 1438374032 + instructions: 250945917 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_get_blob_256_1024_v2: + btreemap_v1_contains_blob_32_16: total: - instructions: 1522510073 + instructions: 263985403 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_get_blob_32_1024: + btreemap_v1_contains_blob_32_256: total: - instructions: 280106753 + instructions: 256218866 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_get_blob_32_1024_v2: + btreemap_v1_contains_blob_32_32: total: - instructions: 358059333 + instructions: 261642152 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_get_blob_4_1024: + btreemap_v1_contains_blob_32_4: total: - instructions: 183878301 + instructions: 259485115 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_get_blob_4_1024_v2: + btreemap_v1_contains_blob_32_512: total: - instructions: 268405509 + instructions: 256710347 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_get_blob_512_1024: + btreemap_v1_contains_blob_32_64: total: - instructions: 2574022258 + instructions: 253200293 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_get_blob_512_1024_v2: + btreemap_v1_contains_blob_32_8: total: - instructions: 2652896326 + instructions: 253531704 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_get_blob_512_1024_v2_mem_manager: + btreemap_v1_contains_blob_4_128: total: - instructions: 2758935791 + instructions: 164310854 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_get_blob_64_1024: + btreemap_v1_contains_blob_512_128: total: - instructions: 522452995 + instructions: 2558114814 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_get_blob_64_1024_v2: + btreemap_v1_contains_blob_64_128: total: - instructions: 602470701 + instructions: 499276473 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_get_blob_8_1024: + btreemap_v1_contains_blob_8_128: total: - instructions: 217400958 + instructions: 190349023 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_get_blob_8_1024_v2: + btreemap_v1_contains_u64_blob8: total: - instructions: 299709230 + instructions: 168557358 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_get_blob_8_u64: + btreemap_v1_contains_u64_u64: total: - instructions: 201178258 + instructions: 168076033 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_get_blob_8_u64_v2: + btreemap_v1_get_blob8_u64: total: - instructions: 298067608 + instructions: 200831001 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_get_u64_blob_8: + btreemap_v1_get_blob_1024_128: total: - instructions: 175651041 + instructions: 4894778854 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_get_u64_blob_8_v2: + btreemap_v1_get_blob_128_128: total: - instructions: 249967569 + instructions: 866386638 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_get_u64_u64: + btreemap_v1_get_blob_16_128: total: - instructions: 176359016 + instructions: 244252154 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_get_u64_u64_v2: + btreemap_v1_get_blob_256_128: total: - instructions: 256656270 + instructions: 1429747414 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_get_u64_u64_v2_mem_manager: + btreemap_v1_get_blob_32_1024: total: - instructions: 336179948 + instructions: 280106753 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_insert_10mib_values: + btreemap_v1_get_blob_32_128: total: - instructions: 5239421355 + instructions: 264428450 heap_increase: 0 - stable_memory_increase: 3613 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_get_blob_32_16: + total: + instructions: 271839337 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_get_blob_32_256: + total: + instructions: 271119738 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_get_blob_32_32: + total: + instructions: 269854309 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_get_blob_32_4: + total: + instructions: 266461283 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_get_blob_32_512: + total: + instructions: 273686516 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_get_blob_32_64: + total: + instructions: 264234944 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_get_blob_32_8: + total: + instructions: 261431662 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_get_blob_4_128: + total: + instructions: 177411615 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_get_blob_512_128: + total: + instructions: 2592720058 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_get_blob_64_128: + total: + instructions: 515600037 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_get_blob_8_128: + total: + instructions: 205217432 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_get_u64_blob8: + total: + instructions: 175701037 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_get_u64_u64: + total: + instructions: 176409011 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_insert_blob8_u64: + total: + instructions: 330197598 + heap_increase: 0 + stable_memory_increase: 6 scopes: {} - btreemap_insert_blob_1024_128: + btreemap_v1_insert_blob_1024_128: total: - instructions: 5110664101 + instructions: 5015476464 heap_increase: 0 stable_memory_increase: 262 scopes: {} - btreemap_insert_blob_1024_128_v2: + btreemap_v1_insert_blob_128_128: total: - instructions: 5201936582 + instructions: 1026455537 heap_increase: 0 - stable_memory_increase: 196 + stable_memory_increase: 61 + scopes: {} + btreemap_v1_insert_blob_16_128: + total: + instructions: 393861615 + heap_increase: 0 + stable_memory_increase: 32 scopes: {} - btreemap_insert_blob_1024_16: + btreemap_v1_insert_blob_256_128: total: - instructions: 5113272660 + instructions: 1574808547 heap_increase: 0 - stable_memory_increase: 241 + stable_memory_increase: 90 scopes: {} - btreemap_insert_blob_1024_16_v2: + btreemap_v1_insert_blob_32_1024: total: - instructions: 5200160649 + instructions: 586992426 heap_increase: 0 - stable_memory_increase: 181 + stable_memory_increase: 230 scopes: {} - btreemap_insert_blob_1024_256: + btreemap_v1_insert_blob_32_128: total: - instructions: 5132006019 + instructions: 424843737 heap_increase: 0 - stable_memory_increase: 292 + stable_memory_increase: 37 scopes: {} - btreemap_insert_blob_1024_256_v2: + btreemap_v1_insert_blob_32_16: total: - instructions: 5225716019 + instructions: 405798192 heap_increase: 0 - stable_memory_increase: 219 + stable_memory_increase: 14 scopes: {} - btreemap_insert_blob_1024_32: + btreemap_v1_insert_blob_32_256: total: - instructions: 5096510160 + instructions: 452817458 heap_increase: 0 - stable_memory_increase: 239 + stable_memory_increase: 66 scopes: {} - btreemap_insert_blob_1024_32_v2: + btreemap_v1_insert_blob_32_32: total: - instructions: 5194736210 + instructions: 408475463 heap_increase: 0 - stable_memory_increase: 180 + stable_memory_increase: 17 scopes: {} - btreemap_insert_blob_1024_4: + btreemap_v1_insert_blob_32_4: total: - instructions: 5019310618 + instructions: 394551749 heap_increase: 0 - stable_memory_increase: 235 + stable_memory_increase: 11 scopes: {} - btreemap_insert_blob_1024_4_v2: + btreemap_v1_insert_blob_32_512: total: - instructions: 5098222305 + instructions: 496535046 heap_increase: 0 - stable_memory_increase: 176 + stable_memory_increase: 121 scopes: {} - btreemap_insert_blob_1024_512: + btreemap_v1_insert_blob_32_64: total: - instructions: 5206323531 + instructions: 411896685 heap_increase: 0 - stable_memory_increase: 348 + stable_memory_increase: 24 scopes: {} - btreemap_insert_blob_1024_512_v2: + btreemap_v1_insert_blob_32_8: total: - instructions: 5305867254 + instructions: 397206540 heap_increase: 0 - stable_memory_increase: 261 + stable_memory_increase: 12 scopes: {} - btreemap_insert_blob_1024_512_v2_mem_manager: + btreemap_v1_insert_blob_4_128: total: - instructions: 5474908000 + instructions: 314942911 heap_increase: 0 - stable_memory_increase: 256 + stable_memory_increase: 17 scopes: {} - btreemap_insert_blob_1024_64: + btreemap_v1_insert_blob_512_128: total: - instructions: 5150175789 + instructions: 2755573810 heap_increase: 0 - stable_memory_increase: 250 + stable_memory_increase: 148 scopes: {} - btreemap_insert_blob_1024_64_v2: + btreemap_v1_insert_blob_64_128: total: - instructions: 5249105297 + instructions: 670128686 heap_increase: 0 - stable_memory_increase: 188 + stable_memory_increase: 46 scopes: {} - btreemap_insert_blob_1024_8: + btreemap_v1_insert_blob_8_128: total: - instructions: 5085348900 + instructions: 360214534 heap_increase: 0 - stable_memory_increase: 237 + stable_memory_increase: 27 scopes: {} - btreemap_insert_blob_1024_8_v2: + btreemap_v1_insert_u64_blob8: total: - instructions: 5187558037 + instructions: 339761585 heap_increase: 0 - stable_memory_increase: 178 + stable_memory_increase: 7 scopes: {} - btreemap_insert_blob_128_1024: + btreemap_v1_insert_u64_u64: total: - instructions: 1273227463 + instructions: 345342581 heap_increase: 0 - stable_memory_increase: 260 + stable_memory_increase: 7 scopes: {} - btreemap_insert_blob_128_1024_v2: + btreemap_v1_pop_first_blob8_u64: total: - instructions: 1373313309 + instructions: 444720569 heap_increase: 0 - stable_memory_increase: 195 + stable_memory_increase: 0 scopes: {} - btreemap_insert_blob_16_1024: + btreemap_v1_pop_first_blob_1024_128: total: - instructions: 637805470 + instructions: 9261592813 heap_increase: 0 - stable_memory_increase: 215 + stable_memory_increase: 0 scopes: {} - btreemap_insert_blob_16_1024_v2: + btreemap_v1_pop_first_blob_128_128: total: - instructions: 732455990 + instructions: 1817778012 heap_increase: 0 - stable_memory_increase: 161 + stable_memory_increase: 0 scopes: {} - btreemap_insert_blob_256_1024: + btreemap_v1_pop_first_blob_16_128: total: - instructions: 1859840193 + instructions: 593286637 heap_increase: 0 - stable_memory_increase: 292 + stable_memory_increase: 0 scopes: {} - btreemap_insert_blob_256_1024_v2: + btreemap_v1_pop_first_blob_256_128: total: - instructions: 1957855803 + instructions: 2896968751 heap_increase: 0 - stable_memory_increase: 219 + stable_memory_increase: 0 scopes: {} - btreemap_insert_blob_32_1024: + btreemap_v1_pop_first_blob_32_1024: total: - instructions: 672870979 + instructions: 959870868 heap_increase: 0 - stable_memory_increase: 230 + stable_memory_increase: 0 scopes: {} - btreemap_insert_blob_32_1024_v2: + btreemap_v1_pop_first_blob_32_128: total: - instructions: 770164792 + instructions: 699286043 heap_increase: 0 - stable_memory_increase: 173 + stable_memory_increase: 0 scopes: {} - btreemap_insert_blob_4_1024: + btreemap_v1_pop_first_blob_32_16: total: - instructions: 497280451 + instructions: 644506427 heap_increase: 0 - stable_memory_increase: 123 + stable_memory_increase: 0 scopes: {} - btreemap_insert_blob_4_1024_v2: + btreemap_v1_pop_first_blob_32_256: total: - instructions: 593852839 + instructions: 736390642 heap_increase: 0 - stable_memory_increase: 92 + stable_memory_increase: 0 scopes: {} - btreemap_insert_blob_512_1024: + btreemap_v1_pop_first_blob_32_32: total: - instructions: 3010795691 + instructions: 656441746 heap_increase: 0 - stable_memory_increase: 351 + stable_memory_increase: 0 scopes: {} - btreemap_insert_blob_512_1024_v2: + btreemap_v1_pop_first_blob_32_4: total: - instructions: 3104696455 + instructions: 625217842 heap_increase: 0 - stable_memory_increase: 263 + stable_memory_increase: 0 scopes: {} - btreemap_insert_blob_64_1024: + btreemap_v1_pop_first_blob_32_512: total: - instructions: 919935850 + instructions: 799853029 heap_increase: 0 - stable_memory_increase: 245 + stable_memory_increase: 0 scopes: {} - btreemap_insert_blob_64_1024_v2: + btreemap_v1_pop_first_blob_32_64: total: - instructions: 1015903332 + instructions: 667712194 heap_increase: 0 - stable_memory_increase: 183 + stable_memory_increase: 0 scopes: {} - btreemap_insert_blob_8_1024: + btreemap_v1_pop_first_blob_32_8: total: - instructions: 607806777 + instructions: 640805887 heap_increase: 0 - stable_memory_increase: 183 + stable_memory_increase: 0 scopes: {} - btreemap_insert_blob_8_1024_v2: + btreemap_v1_pop_first_blob_4_128: total: - instructions: 709530767 + instructions: 280909282 heap_increase: 0 - stable_memory_increase: 138 + stable_memory_increase: 0 scopes: {} - btreemap_insert_blob_8_u64: + btreemap_v1_pop_first_blob_512_128: total: - instructions: 330300136 + instructions: 5012121460 heap_increase: 0 - stable_memory_increase: 6 + stable_memory_increase: 0 scopes: {} - btreemap_insert_blob_8_u64_v2: + btreemap_v1_pop_first_blob_64_128: total: - instructions: 441129700 + instructions: 1151643164 heap_increase: 0 - stable_memory_increase: 4 + stable_memory_increase: 0 scopes: {} - btreemap_insert_u64_blob_8: + btreemap_v1_pop_first_blob_8_128: total: - instructions: 339919034 + instructions: 469166093 heap_increase: 0 - stable_memory_increase: 7 + stable_memory_increase: 0 scopes: {} - btreemap_insert_u64_blob_8_v2: + btreemap_v1_pop_first_u64_blob8: total: - instructions: 420318618 + instructions: 556510476 heap_increase: 0 - stable_memory_increase: 5 + stable_memory_increase: 0 scopes: {} - btreemap_insert_u64_u64: + btreemap_v1_pop_first_u64_u64: total: - instructions: 345460000 + instructions: 559277236 heap_increase: 0 - stable_memory_increase: 7 + stable_memory_increase: 0 scopes: {} - btreemap_insert_u64_u64_v2: + btreemap_v1_pop_last_blob8_u64: total: - instructions: 428895247 + instructions: 430135402 heap_increase: 0 - stable_memory_increase: 6 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_pop_last_blob_1024_128: + total: + instructions: 9063815846 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_pop_last_blob_128_128: + total: + instructions: 1773217986 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_pop_last_blob_16_128: + total: + instructions: 584548731 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_pop_last_blob_256_128: + total: + instructions: 2828277188 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_pop_last_blob_32_1024: + total: + instructions: 938492602 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_pop_last_blob_32_128: + total: + instructions: 676354903 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_pop_last_blob_32_16: + total: + instructions: 628503764 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_pop_last_blob_32_256: + total: + instructions: 714857866 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_pop_last_blob_32_32: + total: + instructions: 638532322 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_pop_last_blob_32_4: + total: + instructions: 616339307 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_pop_last_blob_32_512: + total: + instructions: 785077508 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_pop_last_blob_32_64: + total: + instructions: 645617999 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_pop_last_blob_32_8: + total: + instructions: 619342043 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_pop_last_blob_4_128: + total: + instructions: 273152047 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_pop_last_blob_512_128: + total: + instructions: 4888295538 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_pop_last_blob_64_128: + total: + instructions: 1121279390 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_pop_last_blob_8_128: + total: + instructions: 465916920 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_pop_last_u64_blob8: + total: + instructions: 544226480 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_pop_last_u64_u64: + total: + instructions: 546034093 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_remove_blob8_u64: + total: + instructions: 438619290 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_remove_blob_1024_128: + total: + instructions: 6358955616 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_remove_blob_128_128: + total: + instructions: 1320363518 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_remove_blob_16_128: + total: + instructions: 542024477 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_remove_blob_256_128: + total: + instructions: 2044886726 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_remove_blob_32_1024: + total: + instructions: 827622133 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_remove_blob_32_128: + total: + instructions: 591703191 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_remove_blob_32_16: + total: + instructions: 547780911 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_remove_blob_32_256: + total: + instructions: 627846490 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_remove_blob_32_32: + total: + instructions: 555889629 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_remove_blob_32_4: + total: + instructions: 538909331 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_remove_blob_32_512: + total: + instructions: 698810337 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_remove_blob_32_64: + total: + instructions: 577466550 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_remove_blob_32_8: + total: + instructions: 540805249 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_remove_blob_4_128: + total: + instructions: 344332716 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_remove_blob_512_128: + total: + instructions: 3464987218 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_remove_blob_64_128: + total: + instructions: 878034091 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_remove_blob_8_128: + total: + instructions: 472768582 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_remove_u64_blob8: + total: + instructions: 485773174 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v1_remove_u64_u64: + total: + instructions: 498958513 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_contains_10mib_values: + total: + instructions: 142172404 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_contains_blob8_u64: + total: + instructions: 274472580 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_contains_blob_1024_128: + total: + instructions: 4888113392 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_contains_blob_128_128: + total: + instructions: 921635587 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_contains_blob_16_128: + total: + instructions: 298926344 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_contains_blob_256_128: + total: + instructions: 1476448577 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_contains_blob_32_1024: + total: + instructions: 331723097 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_contains_blob_32_128: + total: + instructions: 328902616 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_contains_blob_32_16: + total: + instructions: 332943555 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_contains_blob_32_256: + total: + instructions: 334271619 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_contains_blob_32_32: + total: + instructions: 333308190 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_contains_blob_32_4: + total: + instructions: 330570325 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_contains_blob_32_512: + total: + instructions: 329379217 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_contains_blob_32_64: + total: + instructions: 331640411 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_contains_blob_32_8: + total: + instructions: 331252604 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_contains_blob_4_128: + total: + instructions: 244866658 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_contains_blob_512_128: + total: + instructions: 2622812000 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_contains_blob_64_128: + total: + instructions: 576398113 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_contains_blob_8_128: + total: + instructions: 265341082 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_contains_u64_blob8: + total: + instructions: 231389818 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_contains_u64_u64: + total: + instructions: 234571046 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_contains_u64_vec8: + total: + instructions: 231389818 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_contains_vec8_u64: + total: + instructions: 363865474 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_contains_vec_1024_128: + total: + instructions: 2831338815 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_contains_vec_128_128: + total: + instructions: 696836232 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_contains_vec_16_128: + total: + instructions: 429805265 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_contains_vec_256_128: + total: + instructions: 1213972484 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_contains_vec_32_1024: + total: + instructions: 577978742 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_contains_vec_32_128: + total: + instructions: 489185033 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_contains_vec_32_16: + total: + instructions: 405008744 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_contains_vec_32_256: + total: + instructions: 521037355 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_contains_vec_32_32: + total: + instructions: 405462644 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_contains_vec_32_4: + total: + instructions: 403519431 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_contains_vec_32_512: + total: + instructions: 538788189 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_contains_vec_32_64: + total: + instructions: 461934047 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_contains_vec_32_8: + total: + instructions: 403356570 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_contains_vec_4_128: + total: + instructions: 397722332 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_contains_vec_512_128: + total: + instructions: 1813147976 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_contains_vec_64_128: + total: + instructions: 595292478 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_contains_vec_8_128: + total: + instructions: 378137062 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_get_10mib_values: + total: + instructions: 1227438335 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_get_blob8_u64: + total: + instructions: 297434310 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_get_blob_1024_128: + total: + instructions: 4951787511 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_get_blob_128_128: + total: + instructions: 949302963 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_get_blob_16_128: + total: + instructions: 320589738 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_get_blob_256_128: + total: + instructions: 1509206562 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_get_blob_32_1024: + total: + instructions: 358059333 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_get_blob_32_128: + total: + instructions: 350707452 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_get_blob_32_16: + total: + instructions: 353348466 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_get_blob_32_256: + total: + instructions: 356718978 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_get_blob_32_32: + total: + instructions: 354219331 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_get_blob_32_4: + total: + instructions: 348029515 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_get_blob_32_512: + total: + instructions: 353097169 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_get_blob_32_64: + total: + instructions: 352954098 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_get_blob_32_8: + total: + instructions: 350573859 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_get_blob_4_128: + total: + instructions: 262677855 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_get_blob_512_128: + total: + instructions: 2665812755 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_get_blob_64_128: + total: + instructions: 601488871 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_get_blob_8_128: + total: + instructions: 286898634 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_get_u64_blob8: + total: + instructions: 250017565 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_get_u64_u64: + total: + instructions: 256706265 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_get_u64_vec8: + total: + instructions: 251930098 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_get_vec8_u64: + total: + instructions: 374122015 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_get_vec_1024_128: + total: + instructions: 2856597689 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_get_vec_128_128: + total: + instructions: 709607342 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_get_vec_16_128: + total: + instructions: 439737518 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_get_vec_256_128: + total: + instructions: 1227258042 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_get_vec_32_1024: + total: + instructions: 599978021 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_get_vec_32_128: + total: + instructions: 499470578 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_get_vec_32_16: + total: + instructions: 413077375 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_get_vec_32_256: + total: + instructions: 538970368 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_get_vec_32_32: + total: + instructions: 413676756 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_get_vec_32_4: + total: + instructions: 411466454 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_get_vec_32_512: + total: + instructions: 543377322 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_get_vec_32_64: + total: + instructions: 470538835 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_get_vec_32_8: + total: + instructions: 411342877 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_get_vec_4_128: + total: + instructions: 407364152 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_get_vec_512_128: + total: + instructions: 1826539276 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_get_vec_64_128: + total: + instructions: 606773904 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_get_vec_8_128: + total: + instructions: 388154870 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_insert_10mib_values: + total: + instructions: 5247381607 + heap_increase: 322 + stable_memory_increase: 3613 + scopes: {} + btreemap_v2_insert_blob8_u64: + total: + instructions: 441032184 + heap_increase: 0 + stable_memory_increase: 4 + scopes: {} + btreemap_v2_insert_blob_1024_128: + total: + instructions: 5106748945 + heap_increase: 0 + stable_memory_increase: 196 + scopes: {} + btreemap_v2_insert_blob_128_128: + total: + instructions: 1129324662 + heap_increase: 0 + stable_memory_increase: 46 + scopes: {} + btreemap_v2_insert_blob_16_128: + total: + instructions: 493504535 + heap_increase: 0 + stable_memory_increase: 24 + scopes: {} + btreemap_v2_insert_blob_256_128: + total: + instructions: 1678818342 + heap_increase: 0 + stable_memory_increase: 67 + scopes: {} + btreemap_v2_insert_blob_32_1024: + total: + instructions: 684286239 + heap_increase: 0 + stable_memory_increase: 173 + scopes: {} + btreemap_v2_insert_blob_32_128: + total: + instructions: 526182471 + heap_increase: 0 + stable_memory_increase: 28 + scopes: {} + btreemap_v2_insert_blob_32_16: + total: + instructions: 505430171 + heap_increase: 0 + stable_memory_increase: 11 + scopes: {} + btreemap_v2_insert_blob_32_256: + total: + instructions: 557130690 + heap_increase: 0 + stable_memory_increase: 49 + scopes: {} + btreemap_v2_insert_blob_32_32: + total: + instructions: 510941484 + heap_increase: 0 + stable_memory_increase: 13 + scopes: {} + btreemap_v2_insert_blob_32_4: + total: + instructions: 493801642 + heap_increase: 0 + stable_memory_increase: 8 + scopes: {} + btreemap_v2_insert_blob_32_512: + total: + instructions: 594780948 + heap_increase: 0 + stable_memory_increase: 91 + scopes: {} + btreemap_v2_insert_blob_32_64: + total: + instructions: 516598879 + heap_increase: 0 + stable_memory_increase: 18 + scopes: {} + btreemap_v2_insert_blob_32_8: + total: + instructions: 500842430 + heap_increase: 0 + stable_memory_increase: 9 + scopes: {} + btreemap_v2_insert_blob_4_128: + total: + instructions: 412410749 + heap_increase: 0 + stable_memory_increase: 13 + scopes: {} + btreemap_v2_insert_blob_512_128: + total: + instructions: 2855923459 + heap_increase: 0 + stable_memory_increase: 111 + scopes: {} + btreemap_v2_insert_blob_64_128: + total: + instructions: 773253385 + heap_increase: 0 + stable_memory_increase: 34 + scopes: {} + btreemap_v2_insert_blob_8_128: + total: + instructions: 463511327 + heap_increase: 0 + stable_memory_increase: 20 + scopes: {} + btreemap_v2_insert_u64_blob8: + total: + instructions: 420165705 + heap_increase: 0 + stable_memory_increase: 5 + scopes: {} + btreemap_v2_insert_u64_u64: + total: + instructions: 428784053 + heap_increase: 0 + stable_memory_increase: 6 + scopes: {} + btreemap_v2_insert_u64_vec8: + total: + instructions: 425736804 + heap_increase: 0 + stable_memory_increase: 21 + scopes: {} + btreemap_v2_insert_vec8_u64: + total: + instructions: 579996622 + heap_increase: 0 + stable_memory_increase: 16 + scopes: {} + btreemap_v2_insert_vec_1024_128: + total: + instructions: 3315990001 + heap_increase: 0 + stable_memory_increase: 193 + scopes: {} + btreemap_v2_insert_vec_128_128: + total: + instructions: 1093934829 + heap_increase: 0 + stable_memory_increase: 51 + scopes: {} + btreemap_v2_insert_vec_16_128: + total: + instructions: 703129374 + heap_increase: 0 + stable_memory_increase: 31 + scopes: {} + btreemap_v2_insert_vec_256_128: + total: + instructions: 1499382744 + heap_increase: 0 + stable_memory_increase: 71 + scopes: {} + btreemap_v2_insert_vec_32_1024: + total: + instructions: 1221878910 + heap_increase: 0 + stable_memory_increase: 171 + scopes: {} + btreemap_v2_insert_vec_32_128: + total: + instructions: 759896597 + heap_increase: 0 + stable_memory_increase: 33 + scopes: {} + btreemap_v2_insert_vec_32_16: + total: + instructions: 661502010 + heap_increase: 0 + stable_memory_increase: 20 + scopes: {} + btreemap_v2_insert_vec_32_256: + total: + instructions: 889401216 + heap_increase: 0 + stable_memory_increase: 54 + scopes: {} + btreemap_v2_insert_vec_32_32: + total: + instructions: 663274347 + heap_increase: 0 + stable_memory_increase: 20 + scopes: {} + btreemap_v2_insert_vec_32_4: + total: + instructions: 658751257 + heap_increase: 0 + stable_memory_increase: 20 + scopes: {} + btreemap_v2_insert_vec_32_512: + total: + instructions: 1005199763 + heap_increase: 0 + stable_memory_increase: 91 + scopes: {} + btreemap_v2_insert_vec_32_64: + total: + instructions: 689418054 + heap_increase: 0 + stable_memory_increase: 24 + scopes: {} + btreemap_v2_insert_vec_32_8: + total: + instructions: 658797740 + heap_increase: 0 + stable_memory_increase: 20 + scopes: {} + btreemap_v2_insert_vec_4_128: + total: + instructions: 608558208 + heap_increase: 0 + stable_memory_increase: 16 + scopes: {} + btreemap_v2_insert_vec_512_128: + total: + instructions: 2121579122 + heap_increase: 0 + stable_memory_increase: 112 + scopes: {} + btreemap_v2_insert_vec_64_128: + total: + instructions: 877271955 + heap_increase: 0 + stable_memory_increase: 41 + scopes: {} + btreemap_v2_insert_vec_8_128: + total: + instructions: 665810021 + heap_increase: 0 + stable_memory_increase: 23 + scopes: {} + btreemap_v2_mem_manager_contains_blob512_u64: + total: + instructions: 2707283290 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_mem_manager_contains_u64_blob512: + total: + instructions: 308772545 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_mem_manager_contains_u64_u64: + total: + instructions: 312538209 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_mem_manager_contains_u64_vec512: + total: + instructions: 390417972 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_mem_manager_contains_vec512_u64: + total: + instructions: 1749726676 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_mem_manager_get_blob512_u64: + total: + instructions: 2752362123 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_mem_manager_get_u64_blob512: + total: + instructions: 333198984 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_mem_manager_get_u64_u64: + total: + instructions: 336204098 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_mem_manager_get_u64_vec512: + total: + instructions: 427374471 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_mem_manager_get_vec512_u64: + total: + instructions: 1787291841 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_mem_manager_insert_blob512_u64: + total: + instructions: 2955955174 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_mem_manager_insert_u64_blob512: + total: + instructions: 644462309 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_mem_manager_insert_u64_u64: + total: + instructions: 557991985 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_mem_manager_insert_u64_vec512: + total: + instructions: 891669337 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_mem_manager_insert_vec512_u64: + total: + instructions: 2227488234 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_mem_manager_remove_blob512_u64: + total: + instructions: 3835034819 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_mem_manager_remove_u64_blob512: + total: + instructions: 948782285 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_mem_manager_remove_u64_u64: + total: + instructions: 810717102 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_mem_manager_remove_u64_vec512: + total: + instructions: 1283006391 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_mem_manager_remove_vec512_u64: + total: + instructions: 3297384664 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_first_blob8_u64: + total: + instructions: 617303857 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_first_blob_1024_128: + total: + instructions: 9400875452 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_first_blob_128_128: + total: + instructions: 2004881412 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_first_blob_16_128: + total: + instructions: 763500904 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_first_blob_256_128: + total: + instructions: 3085312367 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_first_blob_32_1024: + total: + instructions: 1135710878 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_first_blob_32_128: + total: + instructions: 882120705 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_first_blob_32_16: + total: + instructions: 827097840 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_first_blob_32_256: + total: + instructions: 912455234 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_first_blob_32_32: + total: + instructions: 838869815 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_first_blob_32_4: + total: + instructions: 807319067 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_first_blob_32_512: + total: + instructions: 977149672 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_first_blob_32_64: + total: + instructions: 845239297 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_first_blob_32_8: + total: + instructions: 824920261 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_first_blob_4_128: + total: + instructions: 375377277 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_first_blob_512_128: + total: + instructions: 5170716867 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_first_blob_64_128: + total: + instructions: 1330009074 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_first_blob_8_128: + total: + instructions: 617318022 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_first_u64_blob8: + total: + instructions: 713899333 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_first_u64_u64: + total: + instructions: 727979729 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_first_u64_vec8: + total: + instructions: 719801043 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_first_vec8_u64: + total: + instructions: 785966609 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_first_vec_1024_128: + total: + instructions: 5762665068 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_first_vec_128_128: + total: + instructions: 1811516659 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_first_vec_16_128: + total: + instructions: 1027296998 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_first_vec_256_128: + total: + instructions: 2521539128 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_first_vec_32_1024: + total: + instructions: 1814089965 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_first_vec_32_128: + total: + instructions: 1208977447 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_first_vec_32_16: + total: + instructions: 1039721189 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_first_vec_32_256: + total: + instructions: 1328651716 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_first_vec_32_32: + total: + instructions: 1058699254 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_first_vec_32_4: + total: + instructions: 1045400006 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_first_vec_32_512: + total: + instructions: 1491330199 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_first_vec_32_64: + total: + instructions: 1093749625 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_first_vec_32_8: + total: + instructions: 1057049984 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_first_vec_4_128: + total: + instructions: 538967951 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_first_vec_512_128: + total: + instructions: 3598383536 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_first_vec_64_128: + total: + instructions: 1401842064 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_first_vec_8_128: + total: + instructions: 848169529 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_last_blob8_u64: + total: + instructions: 600502538 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_last_blob_1024_128: + total: + instructions: 9217012025 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_last_blob_128_128: + total: + instructions: 1957199634 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_last_blob_16_128: + total: + instructions: 744320686 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_last_blob_256_128: + total: + instructions: 3011499317 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_last_blob_32_1024: + total: + instructions: 1115396827 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_last_blob_32_128: + total: + instructions: 859853922 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_last_blob_32_16: + total: + instructions: 806360194 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_last_blob_32_256: + total: + instructions: 891320794 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_last_blob_32_32: + total: + instructions: 818264570 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_last_blob_32_4: + total: + instructions: 793675589 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_last_blob_32_512: + total: + instructions: 959083225 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_last_blob_32_64: + total: + instructions: 827177067 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_last_blob_32_8: + total: + instructions: 804695603 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_last_blob_4_128: + total: + instructions: 366800060 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_last_blob_512_128: + total: + instructions: 5053486921 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_last_blob_64_128: + total: + instructions: 1309238428 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_last_blob_8_128: + total: + instructions: 617173124 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_last_u64_blob8: + total: + instructions: 701523450 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_last_u64_u64: + total: + instructions: 714112421 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_last_u64_vec8: + total: + instructions: 705766018 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_last_vec8_u64: + total: + instructions: 766225096 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_last_vec_1024_128: + total: + instructions: 6012206614 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_last_vec_128_128: + total: + instructions: 1828348579 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_last_vec_16_128: + total: + instructions: 1015076755 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_last_vec_256_128: + total: + instructions: 2574526031 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_last_vec_32_1024: + total: + instructions: 1809327234 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_last_vec_32_128: + total: + instructions: 1207678989 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_last_vec_32_16: + total: + instructions: 1031044920 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_last_vec_32_256: + total: + instructions: 1325556542 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_last_vec_32_32: + total: + instructions: 1048061923 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_last_vec_32_4: + total: + instructions: 1042839808 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_last_vec_32_512: + total: + instructions: 1492706866 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_last_vec_32_64: + total: + instructions: 1088253911 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_last_vec_32_8: + total: + instructions: 1044711670 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_last_vec_4_128: + total: + instructions: 530157433 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_last_vec_512_128: + total: + instructions: 3721776710 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_last_vec_64_128: + total: + instructions: 1414358129 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_pop_last_vec_8_128: + total: + instructions: 856147026 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_range_count_1k_0b: + total: + instructions: 16892 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_range_count_1k_10kib: + total: + instructions: 2416565 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_range_count_20_10mib: + total: + instructions: 20564081 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_range_key_sum_1k_0b: + total: + instructions: 17501 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_range_key_sum_1k_10kib: + total: + instructions: 57233526 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_range_key_sum_20_10mib: + total: + instructions: 1105817690 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_range_value_sum_1k_0b: + total: + instructions: 17515 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_range_value_sum_1k_10kib: + total: + instructions: 57245522 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_range_value_sum_20_10mib: + total: + instructions: 1105817926 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_remove_10mib_values: + total: + instructions: 5573636474 + heap_increase: 0 + stable_memory_increase: 657 + scopes: {} + btreemap_v2_remove_blob8_u64: + total: + instructions: 587085401 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_remove_blob_1024_128: + total: + instructions: 6476180416 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_remove_blob_128_128: + total: + instructions: 1465625047 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_remove_blob_16_128: + total: + instructions: 682632734 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_remove_blob_256_128: + total: + instructions: 2188863420 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_remove_blob_32_1024: + total: + instructions: 966780709 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_remove_blob_32_128: + total: + instructions: 733628247 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_remove_blob_32_16: + total: + instructions: 690627146 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_remove_blob_32_256: + total: + instructions: 768182232 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_remove_blob_32_32: + total: + instructions: 699082591 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_remove_blob_32_4: + total: + instructions: 681465908 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_remove_blob_32_512: + total: + instructions: 839279049 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_remove_blob_32_64: + total: + instructions: 722801855 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_remove_blob_32_8: + total: + instructions: 682765857 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_remove_blob_4_128: + total: + instructions: 457237151 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_remove_blob_512_128: + total: + instructions: 3599019974 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_remove_blob_64_128: + total: + instructions: 1019995696 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreemap_v2_remove_blob_8_128: + total: + instructions: 610683599 + heap_increase: 0 + stable_memory_increase: 0 scopes: {} - btreemap_insert_u64_u64_v2_mem_manager: + btreemap_v2_remove_u64_blob8: total: - instructions: 558130823 + instructions: 601041979 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_iter_10mib_values: + btreemap_v2_remove_u64_u64: total: - instructions: 11407378 + instructions: 623526291 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_iter_count_10mib_values: + btreemap_v2_remove_u64_vec8: total: - instructions: 477294 + instructions: 607759768 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_iter_count_small_values: + btreemap_v2_remove_vec8_u64: total: - instructions: 9442536 + instructions: 748907285 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_iter_rev_10mib_values: + btreemap_v2_remove_vec_1024_128: total: - instructions: 11404381 + instructions: 5035938287 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_iter_rev_small_values: + btreemap_v2_remove_vec_128_128: total: - instructions: 14975521 + instructions: 1459354860 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_iter_small_values: + btreemap_v2_remove_vec_16_128: total: - instructions: 14978614 + instructions: 907562607 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_keys_10mib_values: + btreemap_v2_remove_vec_256_128: total: - instructions: 464952 + instructions: 2315837497 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_keys_rev_10mib_values: + btreemap_v2_remove_vec_32_1024: total: - instructions: 464595 + instructions: 1683646505 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_keys_rev_small_values: + btreemap_v2_remove_vec_32_128: total: - instructions: 9673706 + instructions: 1012910545 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_keys_small_values: + btreemap_v2_remove_vec_32_16: total: - instructions: 9526093 + instructions: 832461707 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_read_every_third_value_from_range: + btreemap_v2_remove_vec_32_256: total: - instructions: 84178476 + instructions: 1238006415 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_read_keys_from_range: + btreemap_v2_remove_vec_32_32: total: - instructions: 84218480 + instructions: 839169569 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_remove_blob_128_1024: + btreemap_v2_remove_vec_32_4: total: - instructions: 1574675940 + instructions: 837549457 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_remove_blob_128_1024_v2: + btreemap_v2_remove_vec_32_512: total: - instructions: 1717684218 + instructions: 1389586314 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_remove_blob_16_1024: + btreemap_v2_remove_vec_32_64: total: - instructions: 758136944 + instructions: 919280606 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_remove_blob_16_1024_v2: + btreemap_v2_remove_vec_32_8: total: - instructions: 895985762 + instructions: 831328078 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_remove_blob_256_1024: + btreemap_v2_remove_vec_4_128: total: - instructions: 2279163553 + instructions: 656203864 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_remove_blob_256_1024_v2: + btreemap_v2_remove_vec_512_128: total: - instructions: 2417905594 + instructions: 3268373381 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_remove_blob_32_1024: + btreemap_v2_remove_vec_64_128: total: - instructions: 827599093 + instructions: 1181082626 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_remove_blob_32_1024_v2: + btreemap_v2_remove_vec_8_128: total: - instructions: 966757633 + instructions: 817603904 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_remove_blob_4_1024: + btreemap_v2_scan_iter_1k_0b: total: - instructions: 486469240 + instructions: 1493528 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_remove_blob_4_1024_v2: + btreemap_v2_scan_iter_1k_10kib: total: - instructions: 600093407 + instructions: 57070019 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_remove_blob_512_1024: + btreemap_v2_scan_iter_20_10mib: total: - instructions: 3748993388 + instructions: 1103719700 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_remove_blob_512_1024_v2: + btreemap_v2_scan_iter_rev_1k_0b: total: - instructions: 3878241779 + instructions: 1495815 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_remove_blob_64_1024: + btreemap_v2_scan_iter_rev_1k_10kib: total: - instructions: 1141008090 + instructions: 57047806 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_remove_blob_64_1024_v2: + btreemap_v2_scan_iter_rev_20_10mib: total: - instructions: 1280920638 + instructions: 1103719282 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_remove_blob_8_1024: + btreemap_v2_scan_keys_1k_0b: total: - instructions: 644735138 + instructions: 948155 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_remove_blob_8_1024_v2: + btreemap_v2_scan_keys_1k_10kib: total: - instructions: 776768069 + instructions: 2361671 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_remove_blob_8_u64: + btreemap_v2_scan_keys_20_10mib: total: - instructions: 435032682 + instructions: 18465409 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_remove_blob_8_u64_v2: + btreemap_v2_scan_keys_rev_1k_0b: total: - instructions: 584053097 + instructions: 965540 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_remove_u64_blob_8: + btreemap_v2_scan_keys_rev_1k_10kib: total: - instructions: 485748982 + instructions: 2357719 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_remove_u64_blob_8_v2: + btreemap_v2_scan_keys_rev_20_10mib: total: - instructions: 601012747 + instructions: 18465744 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_remove_u64_u64: + btreemap_v2_scan_values_1k_0b: total: - instructions: 498934285 + instructions: 1490926 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_remove_u64_u64_v2: + btreemap_v2_scan_values_1k_10kib: total: - instructions: 623495817 + instructions: 57067417 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_values_10mib_values: + btreemap_v2_scan_values_20_10mib: total: - instructions: 11406858 + instructions: 1103719650 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_values_rev_10mib_values: + btreemap_v2_scan_values_rev_1k_0b: total: - instructions: 11403861 + instructions: 1493213 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_values_rev_small_values: + btreemap_v2_scan_values_rev_1k_10kib: total: - instructions: 14949517 + instructions: 57045204 heap_increase: 0 stable_memory_increase: 0 scopes: {} - btreemap_values_small_values: + btreemap_v2_scan_values_rev_20_10mib: total: - instructions: 14952610 + instructions: 1103719232 heap_increase: 0 stable_memory_increase: 0 scopes: {} @@ -649,49 +2449,49 @@ benches: scopes: {} vec_get_blob_128: total: - instructions: 19306242 + instructions: 19216242 heap_increase: 0 stable_memory_increase: 0 scopes: {} vec_get_blob_16: total: - instructions: 6402226 + instructions: 6432226 heap_increase: 0 stable_memory_increase: 0 scopes: {} vec_get_blob_32: total: - instructions: 7121657 + instructions: 7151657 heap_increase: 0 stable_memory_increase: 0 scopes: {} vec_get_blob_4: total: - instructions: 4849627 + instructions: 4869627 heap_increase: 0 stable_memory_increase: 0 scopes: {} vec_get_blob_4_mem_manager: total: - instructions: 7216977 + instructions: 7236977 heap_increase: 0 stable_memory_increase: 0 scopes: {} vec_get_blob_64: total: - instructions: 11370056 + instructions: 11320056 heap_increase: 0 stable_memory_increase: 0 scopes: {} vec_get_blob_64_mem_manager: total: - instructions: 13710204 + instructions: 13640204 heap_increase: 0 stable_memory_increase: 0 scopes: {} vec_get_blob_8: total: - instructions: 5673873 + instructions: 5776205 heap_increase: 0 stable_memory_increase: 0 scopes: {} diff --git a/src/storable.rs b/src/storable.rs index 8ae6ddec..bf01fa9d 100644 --- a/src/storable.rs +++ b/src/storable.rs @@ -189,6 +189,36 @@ impl Storable for Blob { }; } +/// Byte‑vector for testing size N; otherwise just a Vec. +#[derive(Clone, Default, PartialEq, Eq, PartialOrd, Ord, Debug)] +pub struct FixedVec(Vec); + +impl FixedVec { + pub fn max_size() -> u32 { + N as u32 + } + + pub fn from(slice: &[u8]) -> Self { + assert!(slice.len() <= N); + let mut vec = Vec::with_capacity(N); + vec.extend_from_slice(slice); + vec.resize(N, 0); + FixedVec(vec) + } +} + +impl Storable for FixedVec { + fn to_bytes(&self) -> Cow<[u8]> { + Cow::Owned(self.0.clone()) + } + + fn from_bytes(bytes: Cow<[u8]>) -> Self { + FixedVec(bytes.into_owned()) + } + + const BOUND: Bound = Bound::Unbounded; +} + // NOTE: Below are a few implementations of `Storable` for common types. // Some of these implementations use `unwrap`, as opposed to returning a `Result` // with a possible error. The reason behind this decision is that these