Skip to content

Commit

Permalink
benchmarks for common vector ops across smallvec/tinyvec/std (#1747)
Browse files Browse the repository at this point in the history
* benchmarks for common vector ops

* handle N=1
  • Loading branch information
teh-cmc authored Apr 1, 2023
1 parent 731d941 commit ef2b5dc
Show file tree
Hide file tree
Showing 3 changed files with 337 additions and 0 deletions.
2 changes: 2 additions & 0 deletions Cargo.lock

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

6 changes: 6 additions & 0 deletions crates/re_arrow_store/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,8 @@ polars-core = { workspace = true, features = [
"sort_multiple",
] }
rand = "0.8"
smallvec = { version = "1.0", features = ["const_generics", "union"] }
tinyvec = { version = "1.6", features = ["alloc", "rustc_1_55"] }


[lib]
Expand Down Expand Up @@ -115,3 +117,7 @@ harness = false
[[bench]]
name = "arrow2_convert"
harness = false

[[bench]]
name = "vectors"
harness = false
329 changes: 329 additions & 0 deletions crates/re_arrow_store/benches/vectors.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,329 @@
//! Keeping track of performance issues/regressions for common vector operations.
#[global_allocator]
static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc;

use criterion::{criterion_group, criterion_main, Criterion};

use smallvec::SmallVec;
use tinyvec::TinyVec;

criterion_group!(benches, sort, split, swap, swap_opt);
criterion_main!(benches);

// ---

#[cfg(not(debug_assertions))]
const NUM_INSTANCES: usize = 10_000;
#[cfg(not(debug_assertions))]
const SMALLVEC_SIZE: usize = 4;

// `cargo test` also runs the benchmark setup code, so make sure they run quickly:
#[cfg(debug_assertions)]
const NUM_INSTANCES: usize = 1;
#[cfg(debug_assertions)]
const SMALLVEC_SIZE: usize = 1;

// --- Benchmarks ---

fn split(c: &mut Criterion) {
let mut group = c.benchmark_group(format!("vector_ops/split_off/instances={NUM_INSTANCES}"));
group.throughput(criterion::Throughput::Elements(NUM_INSTANCES as _));

{
fn split_off<T: Copy, const N: usize>(
data: &mut SmallVec<[T; N]>,
split_idx: usize,
) -> SmallVec<[T; N]> {
if split_idx >= data.len() {
return SmallVec::default();
}

let second_half = SmallVec::from_slice(&data[split_idx..]);
data.truncate(split_idx);
second_half
}

let data: SmallVec<[i64; SMALLVEC_SIZE]> = (0..NUM_INSTANCES as i64).collect();

group.bench_function(format!("smallvec/n={SMALLVEC_SIZE}/manual"), |b| {
b.iter(|| {
let mut data = data.clone();
let second_half = split_off(&mut data, NUM_INSTANCES / 2);
assert_eq!(NUM_INSTANCES, data.len() + second_half.len());
assert_eq!(NUM_INSTANCES as i64 / 2, second_half[0]);
(data, second_half)
});
});
}

{
let data: TinyVec<[i64; SMALLVEC_SIZE]> = (0..NUM_INSTANCES as i64).collect();

group.bench_function(format!("tinyvec/n={SMALLVEC_SIZE}"), |b| {
b.iter(|| {
let mut data = data.clone();
let second_half = data.split_off(NUM_INSTANCES / 2);
assert_eq!(NUM_INSTANCES, data.len() + second_half.len());
assert_eq!(NUM_INSTANCES as i64 / 2, second_half[0]);
(data, second_half)
});
});
}

{
fn split_off<T: Default + Copy, const N: usize>(
data: &mut TinyVec<[T; N]>,
split_idx: usize,
) -> TinyVec<[T; N]> {
if split_idx >= data.len() {
return TinyVec::default();
}

let second_half = TinyVec::from(&data[split_idx..]);
data.truncate(split_idx);
second_half
}

let data: TinyVec<[i64; SMALLVEC_SIZE]> = (0..NUM_INSTANCES as i64).collect();

group.bench_function(format!("tinyvec/n={SMALLVEC_SIZE}/manual"), |b| {
b.iter(|| {
let mut data = data.clone();
let second_half = split_off(&mut data, NUM_INSTANCES / 2);
assert_eq!(NUM_INSTANCES, data.len() + second_half.len());
assert_eq!(NUM_INSTANCES as i64 / 2, second_half[0]);
(data, second_half)
});
});
}

{
let data: Vec<i64> = (0..NUM_INSTANCES as i64).collect();

group.bench_function("vec", |b| {
b.iter(|| {
let mut data = data.clone();
let second_half = data.split_off(NUM_INSTANCES / 2);
assert_eq!(NUM_INSTANCES, data.len() + second_half.len());
assert_eq!(NUM_INSTANCES as i64 / 2, second_half[0]);
(data, second_half)
});
});
}

{
fn split_off<T: Copy>(data: &mut Vec<T>, split_idx: usize) -> Vec<T> {
if split_idx >= data.len() {
return Vec::default();
}

let second_half = Vec::from(&data[split_idx..]);
data.truncate(split_idx);
second_half
}

let data: Vec<i64> = (0..NUM_INSTANCES as i64).collect();

group.bench_function("vec/manual", |b| {
b.iter(|| {
let mut data = data.clone();
let second_half = split_off(&mut data, NUM_INSTANCES / 2);
assert_eq!(NUM_INSTANCES, data.len() + second_half.len());
assert_eq!(NUM_INSTANCES as i64 / 2, second_half[0]);
(data, second_half)
});
});
}
}

fn sort(c: &mut Criterion) {
let mut group = c.benchmark_group(format!("vector_ops/sort/instances={NUM_INSTANCES}"));
group.throughput(criterion::Throughput::Elements(NUM_INSTANCES as _));

{
let data: SmallVec<[i64; SMALLVEC_SIZE]> = (0..NUM_INSTANCES as i64).rev().collect();

group.bench_function(format!("smallvec/n={SMALLVEC_SIZE}"), |b| {
b.iter(|| {
let mut data = data.clone();
data.sort_unstable();
assert_eq!(NUM_INSTANCES, data.len());
assert_eq!(NUM_INSTANCES as i64 / 2, data[NUM_INSTANCES / 2]);
data
});
});
}

{
let data: TinyVec<[i64; SMALLVEC_SIZE]> = (0..NUM_INSTANCES as i64).rev().collect();

group.bench_function(format!("tinyvec/n={SMALLVEC_SIZE}"), |b| {
b.iter(|| {
let mut data = data.clone();
data.sort_unstable();
assert_eq!(NUM_INSTANCES, data.len());
assert_eq!(NUM_INSTANCES as i64 / 2, data[NUM_INSTANCES / 2]);
data
});
});
}

{
let data: Vec<i64> = (0..NUM_INSTANCES as i64).rev().collect();

group.bench_function("vec", |b| {
b.iter(|| {
let mut data = data.clone();
data.sort_unstable();
assert_eq!(NUM_INSTANCES, data.len());
assert_eq!(NUM_INSTANCES as i64 / 2, data[NUM_INSTANCES / 2]);
data
});
});
}
}

fn swap(c: &mut Criterion) {
let mut group = c.benchmark_group(format!("vector_ops/swap/instances={NUM_INSTANCES}"));
group.throughput(criterion::Throughput::Elements(NUM_INSTANCES as _));

{
let data: SmallVec<[i64; SMALLVEC_SIZE]> = (0..NUM_INSTANCES as i64).collect();
let swaps: SmallVec<[usize; SMALLVEC_SIZE]> = (0..NUM_INSTANCES).rev().collect();

group.bench_function(format!("smallvec/n={SMALLVEC_SIZE}"), |b| {
b.iter(|| {
let mut data1 = data.clone();
let data2 = data.clone();
for &swap in &swaps {
data1[NUM_INSTANCES - swap - 1] = data2[swap];
}
assert_eq!(NUM_INSTANCES, data1.len());
assert_eq!(NUM_INSTANCES, data2.len());
assert_eq!(
(NUM_INSTANCES as i64 / 2).max(1) - 1,
data1[NUM_INSTANCES / 2]
);
(data1, data2)
});
});
}

{
let data: TinyVec<[i64; SMALLVEC_SIZE]> = (0..NUM_INSTANCES as i64).collect();
let swaps: TinyVec<[usize; SMALLVEC_SIZE]> = (0..NUM_INSTANCES).rev().collect();

group.bench_function(format!("tinyvec/n={SMALLVEC_SIZE}"), |b| {
b.iter(|| {
let mut data1 = data.clone();
let data2 = data.clone();
for &swap in &swaps {
data1[NUM_INSTANCES - swap - 1] = data2[swap];
}
assert_eq!(NUM_INSTANCES, data1.len());
assert_eq!(NUM_INSTANCES, data2.len());
assert_eq!(
(NUM_INSTANCES as i64 / 2).max(1) - 1,
data1[NUM_INSTANCES / 2]
);
(data1, data2)
});
});
}

{
let data: Vec<i64> = (0..NUM_INSTANCES as i64).collect();
let swaps: Vec<usize> = (0..NUM_INSTANCES).rev().collect();

group.bench_function("vec", |b| {
b.iter(|| {
let mut data1 = data.clone();
let data2 = data.clone();
for &swap in &swaps {
data1[NUM_INSTANCES - swap - 1] = data2[swap];
}
assert_eq!(NUM_INSTANCES, data1.len());
assert_eq!(NUM_INSTANCES, data2.len());
assert_eq!(
(NUM_INSTANCES as i64 / 2).max(1) - 1,
data1[NUM_INSTANCES / 2]
);
(data1, data2)
});
});
}
}

fn swap_opt(c: &mut Criterion) {
let mut group = c.benchmark_group(format!("vector_ops/swap_opt/instances={NUM_INSTANCES}"));
group.throughput(criterion::Throughput::Elements(NUM_INSTANCES as _));

{
let data: SmallVec<[Option<i64>; SMALLVEC_SIZE]> =
(0..NUM_INSTANCES as i64).map(Some).collect();
let swaps: SmallVec<[usize; SMALLVEC_SIZE]> = (0..NUM_INSTANCES).rev().collect();

group.bench_function(format!("smallvec/n={SMALLVEC_SIZE}"), |b| {
b.iter(|| {
let mut data1 = data.clone();
let mut data2 = data.clone();
for &swap in &swaps {
data1[NUM_INSTANCES - swap - 1] = data2[swap].take();
}
assert_eq!(NUM_INSTANCES, data1.len());
assert_eq!(NUM_INSTANCES, data2.len());
assert_eq!(
Some((NUM_INSTANCES as i64 / 2).max(1) - 1),
data1[NUM_INSTANCES / 2]
);
(data1, data2)
});
});
}

{
let data: TinyVec<[Option<i64>; SMALLVEC_SIZE]> =
(0..NUM_INSTANCES as i64).map(Some).collect();
let swaps: TinyVec<[usize; SMALLVEC_SIZE]> = (0..NUM_INSTANCES).rev().collect();

group.bench_function(format!("tinyvec/n={SMALLVEC_SIZE}"), |b| {
b.iter(|| {
let mut data1 = data.clone();
let mut data2 = data.clone();
for &swap in &swaps {
data1[NUM_INSTANCES - swap - 1] = data2[swap].take();
}
assert_eq!(NUM_INSTANCES, data1.len());
assert_eq!(NUM_INSTANCES, data2.len());
assert_eq!(
Some((NUM_INSTANCES as i64 / 2).max(1) - 1),
data1[NUM_INSTANCES / 2]
);
(data1, data2)
});
});
}

{
let data: Vec<Option<i64>> = (0..NUM_INSTANCES as i64).map(Some).collect();
let swaps: Vec<usize> = (0..NUM_INSTANCES).rev().collect();

group.bench_function("vec", |b| {
b.iter(|| {
let mut data1 = data.clone();
let mut data2 = data.clone();
for &swap in &swaps {
data1[NUM_INSTANCES - swap - 1] = data2[swap].take();
}
assert_eq!(NUM_INSTANCES, data1.len());
assert_eq!(NUM_INSTANCES, data2.len());
assert_eq!(
Some((NUM_INSTANCES as i64 / 2).max(1) - 1),
data1[NUM_INSTANCES / 2]
);
(data1, data2)
});
});
}
}

1 comment on commit ef2b5dc

@github-actions
Copy link

Choose a reason for hiding this comment

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

Rust Benchmark

Benchmark suite Current: ef2b5dc Previous: 731d941 Ratio
arrow2_convert/serialize/primitive/instances=100000/arrow2_convert 415775 ns/iter (± 659) 410308 ns/iter (± 6427) 1.01
arrow2_convert/serialize/primitive/instances=100000/arrow2/from_values 19569 ns/iter (± 411) 19189 ns/iter (± 264) 1.02
arrow2_convert/serialize/primitive/instances=100000/arrow2/from_vec 19240 ns/iter (± 46) 18837 ns/iter (± 275) 1.02
arrow2_convert/deserialize/primitive/instances=100000/arrow2_convert 99437 ns/iter (± 464) 96526 ns/iter (± 1150) 1.03
arrow2_convert/deserialize/primitive/instances=100000/arrow2/validity_checks 155169 ns/iter (± 578) 203994 ns/iter (± 2029) 0.76
arrow2_convert/deserialize/primitive/instances=100000/arrow2/validity_bypass 57908 ns/iter (± 512) 57785 ns/iter (± 170) 1.00
datastore/num_rows=1000/num_instances=1000/packed=false/insert/default 11329811 ns/iter (± 428484) 10343064 ns/iter (± 246058) 1.10
datastore/num_rows=1000/num_instances=1000/packed=false/insert/bucketsz=0 13693294 ns/iter (± 524358) 12249490 ns/iter (± 415991) 1.12
datastore/num_rows=1000/num_instances=1000/packed=false/insert/bucketsz=2 12771463 ns/iter (± 513341) 11958824 ns/iter (± 723321) 1.07
datastore/num_rows=1000/num_instances=1000/packed=false/insert/bucketsz=32 11417114 ns/iter (± 399697) 10442893 ns/iter (± 378615) 1.09
datastore/num_rows=1000/num_instances=1000/packed=false/insert/bucketsz=2048 11248422 ns/iter (± 442970) 10158891 ns/iter (± 433143) 1.11
datastore/num_rows=1000/num_instances=1000/packed=true/insert/default 10933829 ns/iter (± 465879) 10323251 ns/iter (± 380701) 1.06
datastore/num_rows=1000/num_instances=1000/packed=true/insert/bucketsz=0 13603036 ns/iter (± 510392) 12217243 ns/iter (± 520057) 1.11
datastore/num_rows=1000/num_instances=1000/packed=true/insert/bucketsz=2 12737791 ns/iter (± 614309) 11962435 ns/iter (± 558956) 1.06
datastore/num_rows=1000/num_instances=1000/packed=true/insert/bucketsz=32 11038686 ns/iter (± 398934) 11138464 ns/iter (± 396722) 0.99
datastore/num_rows=1000/num_instances=1000/packed=true/insert/bucketsz=2048 10895292 ns/iter (± 500243) 10181662 ns/iter (± 389992) 1.07
datastore/num_rows=1000/num_instances=1000/packed=false/latest_at/default 1820 ns/iter (± 19) 1793 ns/iter (± 25) 1.02
datastore/num_rows=1000/num_instances=1000/packed=false/latest_at/bucketsz=0 1835 ns/iter (± 9) 1830 ns/iter (± 27) 1.00
datastore/num_rows=1000/num_instances=1000/packed=false/latest_at/bucketsz=2 1809 ns/iter (± 2) 1832 ns/iter (± 23) 0.99
datastore/num_rows=1000/num_instances=1000/packed=false/latest_at/bucketsz=32 1796 ns/iter (± 1) 1820 ns/iter (± 26) 0.99
datastore/num_rows=1000/num_instances=1000/packed=false/latest_at/bucketsz=2048 1801 ns/iter (± 4) 1821 ns/iter (± 27) 0.99
datastore/num_rows=1000/num_instances=1000/packed=true/latest_at/default 1831 ns/iter (± 17) 1831 ns/iter (± 33) 1
datastore/num_rows=1000/num_instances=1000/packed=true/latest_at/bucketsz=0 1821 ns/iter (± 4) 1841 ns/iter (± 25) 0.99
datastore/num_rows=1000/num_instances=1000/packed=true/latest_at/bucketsz=2 1815 ns/iter (± 1) 1850 ns/iter (± 27) 0.98
datastore/num_rows=1000/num_instances=1000/packed=true/latest_at/bucketsz=32 1838 ns/iter (± 3) 1843 ns/iter (± 24) 1.00
datastore/num_rows=1000/num_instances=1000/packed=true/latest_at/bucketsz=2048 1806 ns/iter (± 1) 1828 ns/iter (± 24) 0.99
datastore/num_rows=1000/num_instances=1000/packed=false/latest_at_missing/primary/default 279 ns/iter (± 0) 276 ns/iter (± 3) 1.01
datastore/num_rows=1000/num_instances=1000/packed=false/latest_at_missing/secondaries/default 434 ns/iter (± 0) 422 ns/iter (± 5) 1.03
datastore/num_rows=1000/num_instances=1000/packed=false/latest_at_missing/primary/bucketsz=0 279 ns/iter (± 0) 273 ns/iter (± 3) 1.02
datastore/num_rows=1000/num_instances=1000/packed=false/latest_at_missing/secondaries/bucketsz=0 443 ns/iter (± 2) 428 ns/iter (± 5) 1.04
datastore/num_rows=1000/num_instances=1000/packed=false/latest_at_missing/primary/bucketsz=2 279 ns/iter (± 0) 275 ns/iter (± 3) 1.01
datastore/num_rows=1000/num_instances=1000/packed=false/latest_at_missing/secondaries/bucketsz=2 443 ns/iter (± 0) 437 ns/iter (± 5) 1.01
datastore/num_rows=1000/num_instances=1000/packed=false/latest_at_missing/primary/bucketsz=32 279 ns/iter (± 0) 275 ns/iter (± 3) 1.01
datastore/num_rows=1000/num_instances=1000/packed=false/latest_at_missing/secondaries/bucketsz=32 440 ns/iter (± 1) 430 ns/iter (± 6) 1.02
datastore/num_rows=1000/num_instances=1000/packed=false/latest_at_missing/primary/bucketsz=2048 279 ns/iter (± 0) 274 ns/iter (± 4) 1.02
datastore/num_rows=1000/num_instances=1000/packed=false/latest_at_missing/secondaries/bucketsz=2048 435 ns/iter (± 0) 423 ns/iter (± 5) 1.03
datastore/num_rows=1000/num_instances=1000/packed=true/latest_at_missing/primary/default 279 ns/iter (± 0) 274 ns/iter (± 3) 1.02
datastore/num_rows=1000/num_instances=1000/packed=true/latest_at_missing/secondaries/default 435 ns/iter (± 9) 424 ns/iter (± 5) 1.03
datastore/num_rows=1000/num_instances=1000/packed=true/latest_at_missing/primary/bucketsz=0 278 ns/iter (± 0) 274 ns/iter (± 3) 1.01
datastore/num_rows=1000/num_instances=1000/packed=true/latest_at_missing/secondaries/bucketsz=0 443 ns/iter (± 0) 435 ns/iter (± 5) 1.02
datastore/num_rows=1000/num_instances=1000/packed=true/latest_at_missing/primary/bucketsz=2 278 ns/iter (± 0) 278 ns/iter (± 4) 1
datastore/num_rows=1000/num_instances=1000/packed=true/latest_at_missing/secondaries/bucketsz=2 443 ns/iter (± 0) 432 ns/iter (± 6) 1.03
datastore/num_rows=1000/num_instances=1000/packed=true/latest_at_missing/primary/bucketsz=32 280 ns/iter (± 0) 273 ns/iter (± 3) 1.03
datastore/num_rows=1000/num_instances=1000/packed=true/latest_at_missing/secondaries/bucketsz=32 440 ns/iter (± 0) 427 ns/iter (± 6) 1.03
datastore/num_rows=1000/num_instances=1000/packed=true/latest_at_missing/primary/bucketsz=2048 279 ns/iter (± 0) 275 ns/iter (± 4) 1.01
datastore/num_rows=1000/num_instances=1000/packed=true/latest_at_missing/secondaries/bucketsz=2048 435 ns/iter (± 0) 425 ns/iter (± 6) 1.02
datastore/num_rows=1000/num_instances=1000/packed=false/range/default 11807336 ns/iter (± 560492) 10752330 ns/iter (± 411952) 1.10
datastore/num_rows=1000/num_instances=1000/packed=false/range/bucketsz=0 2173789 ns/iter (± 15425) 2182961 ns/iter (± 21243) 1.00
datastore/num_rows=1000/num_instances=1000/packed=false/range/bucketsz=2 2162677 ns/iter (± 18540) 2130683 ns/iter (± 22110) 1.02
datastore/num_rows=1000/num_instances=1000/packed=false/range/bucketsz=32 1931980 ns/iter (± 28027) 1860838 ns/iter (± 21077) 1.04
datastore/num_rows=1000/num_instances=1000/packed=false/range/bucketsz=2048 1849934 ns/iter (± 17411) 1845662 ns/iter (± 15458) 1.00
datastore/num_rows=1000/num_instances=1000/packed=true/range/default 11261033 ns/iter (± 537235) 10462736 ns/iter (± 577240) 1.08
datastore/num_rows=1000/num_instances=1000/packed=true/range/bucketsz=0 2161285 ns/iter (± 8396) 2103385 ns/iter (± 19106) 1.03
datastore/num_rows=1000/num_instances=1000/packed=true/range/bucketsz=2 2176439 ns/iter (± 8160) 2075487 ns/iter (± 20604) 1.05
datastore/num_rows=1000/num_instances=1000/packed=true/range/bucketsz=32 1867103 ns/iter (± 11327) 1804672 ns/iter (± 20187) 1.03
datastore/num_rows=1000/num_instances=1000/packed=true/range/bucketsz=2048 1851533 ns/iter (± 8203) 1823620 ns/iter (± 18059) 1.02
vector_ops/sort/instances=10000/smallvec/n=4 12486 ns/iter (± 20)
vector_ops/sort/instances=10000/tinyvec/n=4 9659 ns/iter (± 35)
vector_ops/sort/instances=10000/vec 9642 ns/iter (± 25)
vector_ops/split_off/instances=10000/smallvec/n=4/manual 5558 ns/iter (± 124)
vector_ops/split_off/instances=10000/tinyvec/n=4 2737 ns/iter (± 27)
vector_ops/split_off/instances=10000/tinyvec/n=4/manual 2747 ns/iter (± 12)
vector_ops/split_off/instances=10000/vec 2731 ns/iter (± 13)
vector_ops/split_off/instances=10000/vec/manual 2729 ns/iter (± 25)
vector_ops/swap/instances=10000/smallvec/n=4 32770 ns/iter (± 22)
vector_ops/swap/instances=10000/tinyvec/n=4 18281 ns/iter (± 28)
vector_ops/swap/instances=10000/vec 12303 ns/iter (± 15)
vector_ops/swap_opt/instances=10000/smallvec/n=4 42722 ns/iter (± 19)
vector_ops/swap_opt/instances=10000/tinyvec/n=4 28853 ns/iter (± 36)
vector_ops/swap_opt/instances=10000/vec 20491 ns/iter (± 34)
mono_points_arrow/generate_message_bundles 42610459 ns/iter (± 446806) 43260194 ns/iter (± 1005004) 0.98
mono_points_arrow/generate_messages 164984628 ns/iter (± 1176101) 179520051 ns/iter (± 2470426) 0.92
mono_points_arrow/encode_log_msg 207721489 ns/iter (± 616974) 219339638 ns/iter (± 1476377) 0.95
mono_points_arrow/encode_total 414635430 ns/iter (± 1420892) 440252153 ns/iter (± 2760339) 0.94
mono_points_arrow/decode_log_msg 253209953 ns/iter (± 750410) 263740553 ns/iter (± 2072629) 0.96
mono_points_arrow/decode_message_bundles 86431144 ns/iter (± 597833) 94875201 ns/iter (± 1292781) 0.91
mono_points_arrow/decode_total 339966947 ns/iter (± 1496559) 358081485 ns/iter (± 2638856) 0.95
mono_points_arrow_batched/generate_message_bundles 35656570 ns/iter (± 1378597) 31338943 ns/iter (± 1429791) 1.14
mono_points_arrow_batched/generate_messages 9887865 ns/iter (± 1041928) 8170055 ns/iter (± 690173) 1.21
mono_points_arrow_batched/encode_log_msg 1824556 ns/iter (± 8506) 1756504 ns/iter (± 17284) 1.04
mono_points_arrow_batched/encode_total 48036858 ns/iter (± 1475531) 44816011 ns/iter (± 1746379) 1.07
mono_points_arrow_batched/decode_log_msg 977943 ns/iter (± 3480) 976277 ns/iter (± 5357) 1.00
mono_points_arrow_batched/decode_message_bundles 19092287 ns/iter (± 978872) 16445757 ns/iter (± 983011) 1.16
mono_points_arrow_batched/decode_total 20090836 ns/iter (± 700021) 18159103 ns/iter (± 1113770) 1.11
batch_points_arrow/generate_message_bundles 287474 ns/iter (± 744) 280199 ns/iter (± 3113) 1.03
batch_points_arrow/generate_messages 7686 ns/iter (± 20) 7497 ns/iter (± 89) 1.03
batch_points_arrow/encode_log_msg 384987 ns/iter (± 1634) 384888 ns/iter (± 3635) 1.00
batch_points_arrow/encode_total 701297 ns/iter (± 3261) 681864 ns/iter (± 8286) 1.03
batch_points_arrow/decode_log_msg 341321 ns/iter (± 1794) 339360 ns/iter (± 2724) 1.01
batch_points_arrow/decode_message_bundles 2942 ns/iter (± 12) 2855 ns/iter (± 30) 1.03
batch_points_arrow/decode_total 347381 ns/iter (± 900) 346776 ns/iter (± 1945) 1.00
arrow_mono_points/insert 6111644425 ns/iter (± 16788224) 6802765507 ns/iter (± 28220893) 0.90
arrow_mono_points/query 1792954 ns/iter (± 10995) 1716591 ns/iter (± 22023) 1.04
arrow_batch_points/insert 3053739 ns/iter (± 12222) 2973626 ns/iter (± 33957) 1.03
arrow_batch_points/query 16429 ns/iter (± 36) 16562 ns/iter (± 201) 0.99
arrow_batch_vecs/insert 43026 ns/iter (± 111) 42046 ns/iter (± 613) 1.02
arrow_batch_vecs/query 506430 ns/iter (± 471) 523611 ns/iter (± 7056) 0.97
tuid/Tuid::random 34 ns/iter (± 0) 34 ns/iter (± 0) 1

This comment was automatically generated by workflow using github-action-benchmark.

Please sign in to comment.