Skip to content

Commit

Permalink
Columnar timepoints in data tables and during transport (#1767)
Browse files Browse the repository at this point in the history
* columnar timepoints

* self review
  • Loading branch information
teh-cmc committed Apr 4, 2023
1 parent 1713e60 commit 9310bd7
Show file tree
Hide file tree
Showing 4 changed files with 171 additions and 213 deletions.
177 changes: 154 additions & 23 deletions crates/re_log_types/src/data_table.rs
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
use std::collections::BTreeMap;

use ahash::HashMap;
use itertools::Itertools as _;
use nohash_hasher::{IntMap, IntSet};
use smallvec::SmallVec;

use crate::{
ArrowMsg, ComponentName, DataCell, DataCellError, DataRow, DataRowError, EntityPath, MsgId,
TimePoint,
TimePoint, Timeline,
};

// ---
Expand All @@ -15,6 +17,11 @@ pub enum DataTableError {
#[error("Trying to deserialize data that is missing a column present in the schema: {0:?}")]
MissingColumn(String),

#[error(
"Trying to deserialize time column data with invalid datatype: {name:?} ({datatype:#?})"
)]
NotATimeColumn { name: String, datatype: DataType },

#[error("Trying to deserialize column data that doesn't contain any ListArrays: {0:?}")]
NotAColumn(String),

Expand All @@ -37,6 +44,7 @@ pub type DataTableResult<T> = ::std::result::Result<T, DataTableError>;
// ---

type RowIdVec = SmallVec<[MsgId; 4]>;
type TimeOptVec = SmallVec<[Option<i64>; 4]>;
type TimePointVec = SmallVec<[TimePoint; 4]>;
type EntityPathVec = SmallVec<[EntityPath; 4]>;
type NumInstancesVec = SmallVec<[u32; 4]>;
Expand Down Expand Up @@ -229,8 +237,11 @@ pub struct DataTable {
/// The entire column of `RowId`s.
pub row_id: RowIdVec,

/// The entire column of [`TimePoint`]s.
pub timepoint: TimePointVec,
/// All the rows for all the time columns.
///
/// The times are optional since not all rows are guaranteed to have a timestamp for every
/// single timeline (though it is highly likely to be the case in practice).
pub col_timelines: BTreeMap<Timeline, TimeOptVec>,

/// The entire column of [`EntityPath`]s.
pub entity_path: EntityPathVec,
Expand All @@ -251,7 +262,7 @@ impl DataTable {
Self {
table_id,
row_id: Default::default(),
timepoint: Default::default(),
col_timelines: Default::default(),
entity_path: Default::default(),
num_instances: Default::default(),
columns: Default::default(),
Expand Down Expand Up @@ -287,6 +298,24 @@ impl DataTable {
})
.multiunzip();

// All time columns.
let mut col_timelines: BTreeMap<Timeline, TimeOptVec> = BTreeMap::default();
for (i, timepoint) in timepoint.iter().enumerate() {
for (timeline, time) in timepoint.iter() {
match col_timelines.entry(*timeline) {
std::collections::btree_map::Entry::Vacant(entry) => {
entry
.insert(smallvec::smallvec![None; i])
.push(Some(time.as_i64()));
}
std::collections::btree_map::Entry::Occupied(mut entry) => {
let entry = entry.get_mut();
entry.push(Some(time.as_i64()));
}
}
}
}

// Pre-allocate all columns (one per component).
let mut columns = IntMap::default();
for component in components {
Expand Down Expand Up @@ -314,7 +343,7 @@ impl DataTable {
Self {
table_id,
row_id,
timepoint,
col_timelines,
entity_path,
num_instances,
columns,
Expand All @@ -335,7 +364,7 @@ impl DataTable {
let Self {
table_id: _,
row_id,
timepoint,
col_timelines,
entity_path,
num_instances,
columns,
Expand All @@ -348,7 +377,14 @@ impl DataTable {

DataRow::from_cells(
row_id[i],
timepoint[i].clone(),
TimePoint::from(
col_timelines
.iter()
.filter_map(|(timeline, times)| {
times[i].map(|time| (*timeline, time.into()))
})
.collect::<BTreeMap<_, _>>(),
),
entity_path[i].clone(),
num_instances[i],
cells,
Expand All @@ -360,19 +396,23 @@ impl DataTable {
/// and returns the corresponding [`TimePoint`].
#[inline]
pub fn timepoint_max(&self) -> TimePoint {
self.timepoint
.iter()
.fold(TimePoint::timeless(), |acc, tp| acc.union_max(tp))
let mut timepoint = TimePoint::timeless();
for (timeline, col_time) in &self.col_timelines {
if let Some(time) = col_time.iter().flatten().max().copied() {
timepoint.insert(*timeline, time.into());
}
}
timepoint
}
}

// --- Serialization ---

use arrow2::{
array::{Array, ListArray},
array::{Array, ListArray, PrimitiveArray},
bitmap::Bitmap,
chunk::Chunk,
datatypes::{DataType, Field, Schema},
datatypes::{DataType, Field, Schema, TimeUnit},
offset::Offsets,
};
use arrow2_convert::{
Expand All @@ -383,13 +423,13 @@ use arrow2_convert::{
// TODO(#1696): Those names should come from the datatypes themselves.

pub const COLUMN_ROW_ID: &str = "rerun.row_id";
pub const COLUMN_TIMEPOINT: &str = "rerun.timepoint";
pub const COLUMN_ENTITY_PATH: &str = "rerun.entity_path";
pub const COLUMN_NUM_INSTANCES: &str = "rerun.num_instances";

pub const METADATA_KIND: &str = "rerun.kind";
pub const METADATA_KIND_DATA: &str = "data";
pub const METADATA_KIND_CONTROL: &str = "control";
pub const METADATA_KIND_TIME: &str = "time";
pub const METADATA_TABLE_ID: &str = "rerun.table_id";

impl DataTable {
Expand All @@ -400,6 +440,9 @@ impl DataTable {
/// * Control columns are those that drive the behavior of the storage systems.
/// They are always present, always dense, and always deserialized upon reception by the
/// server.
/// Internally, time columns are (de)serialized separately from the rest of the control
/// columns for efficiency/QOL concerns: that doesn't change the fact that they are control
/// columns all the same!
/// * Data columns are the one that hold component data.
/// They are optional, potentially sparse, and never deserialized on the server-side (not by
/// the storage systems, at least).
Expand All @@ -409,6 +452,13 @@ impl DataTable {
let mut schema = Schema::default();
let mut columns = Vec::new();

{
let (control_schema, control_columns) = self.serialize_time_columns();
schema.fields.extend(control_schema.fields);
schema.metadata.extend(control_schema.metadata);
columns.extend(control_columns.into_iter());
}

{
let (control_schema, control_columns) = self.serialize_control_columns()?;
schema.fields.extend(control_schema.fields);
Expand All @@ -426,6 +476,43 @@ impl DataTable {
Ok((schema, Chunk::new(columns)))
}

/// Serializes all time columns into an arrow payload and schema.
fn serialize_time_columns(&self) -> (Schema, Vec<Box<dyn Array>>) {
crate::profile_function!();

fn serialize_time_column(
timeline: Timeline,
times: &TimeOptVec,
) -> (Field, Box<dyn Array>) {
let data = PrimitiveArray::from(times.as_slice()).to(timeline.datatype());

let field = Field::new(timeline.name().as_str(), data.data_type().clone(), false)
.with_metadata([(METADATA_KIND.to_owned(), METADATA_KIND_TIME.to_owned())].into());

(field, data.boxed())
}

let Self {
table_id: _,
row_id: _,
col_timelines,
entity_path: _,
num_instances: _,
columns: _,
} = self;

let mut schema = Schema::default();
let mut columns = Vec::new();

for (timeline, col_time) in col_timelines {
let (time_field, time_column) = serialize_time_column(*timeline, col_time);
schema.fields.push(time_field);
columns.push(time_column);
}

(schema, columns)
}

/// Serializes all controls columns into an arrow payload and schema.
///
/// Control columns are those that drive the behavior of the storage systems.
Expand Down Expand Up @@ -476,7 +563,7 @@ impl DataTable {
let Self {
table_id,
row_id,
timepoint,
col_timelines: _,
entity_path,
num_instances,
columns: _,
Expand All @@ -489,11 +576,6 @@ impl DataTable {
schema.fields.push(row_id_field);
columns.push(row_id_column);

let (timepoint_field, timepoint_column) =
serialize_dense_column(COLUMN_TIMEPOINT, timepoint)?;
schema.fields.push(timepoint_field);
columns.push(timepoint_column);

let (entity_path_field, entity_path_column) =
serialize_dense_column(COLUMN_ENTITY_PATH, entity_path)?;
schema.fields.push(entity_path_field);
Expand All @@ -520,7 +602,7 @@ impl DataTable {
let Self {
table_id: _,
row_id: _,
timepoint: _,
col_timelines: _,
entity_path: _,
num_instances: _,
columns: table,
Expand Down Expand Up @@ -603,6 +685,28 @@ impl DataTable {
) -> DataTableResult<Self> {
crate::profile_function!();

// --- Time ---

let col_timelines: DataTableResult<_> = schema
.fields
.iter()
.enumerate()
.filter_map(|(i, field)| {
field.metadata.get(METADATA_KIND).and_then(|kind| {
(kind == METADATA_KIND_TIME).then_some((field.name.as_str(), i))
})
})
.map(|(name, index)| {
chunk
.get(index)
.ok_or(DataTableError::MissingColumn(name.to_owned()))
.and_then(|column| Self::deserialize_time_column(name, &**column))
})
.collect();
let col_timelines = col_timelines?;

// --- Control ---

let control_indices: HashMap<&str, usize> = schema
.fields
.iter()
Expand All @@ -623,14 +727,14 @@ impl DataTable {
// NOTE: the unwrappings cannot fail since control_index() makes sure the index is valid
let row_id =
(&**chunk.get(control_index(COLUMN_ROW_ID)?).unwrap()).try_into_collection()?;
let timepoint =
(&**chunk.get(control_index(COLUMN_TIMEPOINT)?).unwrap()).try_into_collection()?;
let entity_path =
(&**chunk.get(control_index(COLUMN_ENTITY_PATH)?).unwrap()).try_into_collection()?;
// TODO(#1712): This is unnecessarily slow...
let num_instances =
(&**chunk.get(control_index(COLUMN_NUM_INSTANCES)?).unwrap()).try_into_collection()?;

// --- Components ---

let columns: DataTableResult<_> = schema
.fields
.iter()
Expand All @@ -656,13 +760,40 @@ impl DataTable {
Ok(Self {
table_id,
row_id,
timepoint,
col_timelines,
entity_path,
num_instances,
columns,
})
}

/// Deserializes a sparse time column.
fn deserialize_time_column(
name: &str,
column: &dyn Array,
) -> DataTableResult<(Timeline, TimeOptVec)> {
// See also [`Timeline::datatype`]
let timeline = match column.data_type().to_logical_type() {
DataType::Int64 => Timeline::new_sequence(name),
DataType::Timestamp(TimeUnit::Nanosecond, None) => Timeline::new_temporal(name),
_ => {
return Err(DataTableError::NotATimeColumn {
name: name.into(),
datatype: column.data_type().clone(),
})
}
};

let col_time = column
.as_any()
.downcast_ref::<PrimitiveArray<i64>>()
// NOTE: cannot fail, datatype checked above
.unwrap();
let col_time: TimeOptVec = col_time.into_iter().map(|time| time.copied()).collect();

Ok((timeline, col_time))
}

/// Deserializes a sparse data column.
fn deserialize_data_column(
component: ComponentName,
Expand Down
Loading

1 comment on commit 9310bd7

@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: 9310bd7 Previous: 1713e60 Ratio
arrow2/size_bytes/primitive/rows=10000/instances=100/array 146399 ns/iter (± 706) 146739 ns/iter (± 561) 1.00
arrow2/size_bytes/primitive/rows=10000/instances=100/vec 3288 ns/iter (± 16) 3289 ns/iter (± 6) 1.00
arrow2/size_bytes/primitive/rows=10000/instances=100/vec/erased 17722 ns/iter (± 7) 17735 ns/iter (± 9) 1.00
arrow2/size_bytes/struct/rows=10000/instances=100/array 485170 ns/iter (± 3186) 485695 ns/iter (± 3487) 1.00
arrow2/size_bytes/struct/rows=10000/instances=100/vec 3294 ns/iter (± 67) 3291 ns/iter (± 8) 1.00
arrow2/size_bytes/struct/rows=10000/instances=100/vec/erased 17724 ns/iter (± 7) 17722 ns/iter (± 6) 1.00
arrow2/size_bytes/struct_large/rows=10000/instances=100/array 4564682 ns/iter (± 532516) 4325396 ns/iter (± 472983) 1.06
arrow2/size_bytes/struct_large/rows=10000/instances=100/vec 3984 ns/iter (± 8) 3986 ns/iter (± 14) 1.00
arrow2/size_bytes/struct_large/rows=10000/instances=100/vec/erased 17724 ns/iter (± 8) 17728 ns/iter (± 7) 1.00
arrow2/erased_clone/primitive/rows=10000/instances=100/cell/arc_erased 779865 ns/iter (± 1306) 799086 ns/iter (± 1985) 0.98
arrow2/erased_clone/primitive/rows=10000/instances=100/cell/wrapped_in_arc 194109 ns/iter (± 307) 195639 ns/iter (± 482) 0.99
arrow2/erased_clone/primitive/rows=10000/instances=100/array 745144 ns/iter (± 4025) 742243 ns/iter (± 2177) 1.00
arrow2/erased_clone/primitive/rows=10000/instances=100/array/downcast_first 346032 ns/iter (± 918) 345258 ns/iter (± 1774) 1.00
arrow2/erased_clone/primitive/rows=10000/instances=100/vec/full_copy 1047521 ns/iter (± 27455) 1432802 ns/iter (± 147672) 0.73
arrow2/erased_clone/primitive/rows=10000/instances=100/vec/wrapped_in_arc 127172 ns/iter (± 224) 127135 ns/iter (± 230) 1.00
arrow2/erased_clone/struct/rows=10000/instances=100/cell/arc_erased 4477713 ns/iter (± 361999) 4674567 ns/iter (± 246438) 0.96
arrow2/erased_clone/struct/rows=10000/instances=100/cell/wrapped_in_arc 286384 ns/iter (± 577) 278073 ns/iter (± 875) 1.03
arrow2/erased_clone/struct/rows=10000/instances=100/array 4335741 ns/iter (± 191016) 4698680 ns/iter (± 335213) 0.92
arrow2/erased_clone/struct/rows=10000/instances=100/array/downcast_first 3654403 ns/iter (± 133389) 4185773 ns/iter (± 169580) 0.87
arrow2/erased_clone/struct/rows=10000/instances=100/vec/full_copy 1295272 ns/iter (± 28240) 1404705 ns/iter (± 171255) 0.92
arrow2/erased_clone/struct/rows=10000/instances=100/vec/wrapped_in_arc 127388 ns/iter (± 121) 127829 ns/iter (± 130) 1.00
arrow2/erased_clone/struct_large/rows=10000/instances=100/cell/arc_erased 48198887 ns/iter (± 389003) 49339245 ns/iter (± 291721) 0.98
arrow2/erased_clone/struct_large/rows=10000/instances=100/cell/wrapped_in_arc 173625 ns/iter (± 287) 173341 ns/iter (± 582) 1.00
arrow2/erased_clone/struct_large/rows=10000/instances=100/array 47988070 ns/iter (± 518205) 48133569 ns/iter (± 404751) 1.00
arrow2/erased_clone/struct_large/rows=10000/instances=100/array/downcast_first 44718569 ns/iter (± 434818) 46491274 ns/iter (± 537484) 0.96
arrow2/erased_clone/struct_large/rows=10000/instances=100/vec/full_copy 4610544 ns/iter (± 236176) 5066246 ns/iter (± 85901) 0.91
arrow2/erased_clone/struct_large/rows=10000/instances=100/vec/wrapped_in_arc 127699 ns/iter (± 86) 126956 ns/iter (± 403) 1.01
arrow2_convert/serialize/primitive/instances=100000/arrow2_convert 415179 ns/iter (± 9289) 415374 ns/iter (± 4568) 1.00
arrow2_convert/serialize/primitive/instances=100000/arrow2/from_values 19220 ns/iter (± 32) 19460 ns/iter (± 66) 0.99
arrow2_convert/serialize/primitive/instances=100000/arrow2/from_vec 19219 ns/iter (± 21) 19479 ns/iter (± 111) 0.99
arrow2_convert/deserialize/primitive/instances=100000/arrow2_convert 98531 ns/iter (± 279) 98494 ns/iter (± 1060) 1.00
arrow2_convert/deserialize/primitive/instances=100000/arrow2/validity_checks 160421 ns/iter (± 317) 161263 ns/iter (± 394) 0.99
arrow2_convert/deserialize/primitive/instances=100000/arrow2/validity_bypass 58292 ns/iter (± 59) 58607 ns/iter (± 168) 0.99
datastore/num_rows=1000/num_instances=1000/packed=false/insert/default 12274385 ns/iter (± 515633) 13351790 ns/iter (± 464566) 0.92
datastore/num_rows=1000/num_instances=1000/packed=false/insert/bucketsz=0 14833800 ns/iter (± 874699) 15398070 ns/iter (± 756505) 0.96
datastore/num_rows=1000/num_instances=1000/packed=false/insert/bucketsz=2 14164695 ns/iter (± 890858) 14207999 ns/iter (± 580479) 1.00
datastore/num_rows=1000/num_instances=1000/packed=false/insert/bucketsz=32 12140770 ns/iter (± 648749) 14757831 ns/iter (± 1261883) 0.82
datastore/num_rows=1000/num_instances=1000/packed=false/insert/bucketsz=2048 11171798 ns/iter (± 594932) 12792116 ns/iter (± 731378) 0.87
datastore/num_rows=1000/num_instances=1000/packed=true/insert/default 11055164 ns/iter (± 501466) 12484322 ns/iter (± 487203) 0.89
datastore/num_rows=1000/num_instances=1000/packed=true/insert/bucketsz=0 13091573 ns/iter (± 593220) 14964285 ns/iter (± 670735) 0.87
datastore/num_rows=1000/num_instances=1000/packed=true/insert/bucketsz=2 12893049 ns/iter (± 601100) 14910080 ns/iter (± 769303) 0.86
datastore/num_rows=1000/num_instances=1000/packed=true/insert/bucketsz=32 11717922 ns/iter (± 605858) 12373254 ns/iter (± 538765) 0.95
datastore/num_rows=1000/num_instances=1000/packed=true/insert/bucketsz=2048 11586324 ns/iter (± 546005) 14589731 ns/iter (± 473161) 0.79
datastore/num_rows=1000/num_instances=1000/packed=false/latest_at/default 1828 ns/iter (± 23) 1831 ns/iter (± 26) 1.00
datastore/num_rows=1000/num_instances=1000/packed=false/latest_at/bucketsz=0 1820 ns/iter (± 11) 1818 ns/iter (± 4) 1.00
datastore/num_rows=1000/num_instances=1000/packed=false/latest_at/bucketsz=2 1809 ns/iter (± 5) 1813 ns/iter (± 1) 1.00
datastore/num_rows=1000/num_instances=1000/packed=false/latest_at/bucketsz=32 1788 ns/iter (± 6) 1823 ns/iter (± 4) 0.98
datastore/num_rows=1000/num_instances=1000/packed=false/latest_at/bucketsz=2048 1790 ns/iter (± 11) 1800 ns/iter (± 1) 0.99
datastore/num_rows=1000/num_instances=1000/packed=true/latest_at/default 1853 ns/iter (± 17) 1836 ns/iter (± 18) 1.01
datastore/num_rows=1000/num_instances=1000/packed=true/latest_at/bucketsz=0 1836 ns/iter (± 4) 1852 ns/iter (± 1) 0.99
datastore/num_rows=1000/num_instances=1000/packed=true/latest_at/bucketsz=2 1811 ns/iter (± 3) 1838 ns/iter (± 3) 0.99
datastore/num_rows=1000/num_instances=1000/packed=true/latest_at/bucketsz=32 1823 ns/iter (± 1) 1826 ns/iter (± 1) 1.00
datastore/num_rows=1000/num_instances=1000/packed=true/latest_at/bucketsz=2048 1794 ns/iter (± 0) 1815 ns/iter (± 3) 0.99
datastore/num_rows=1000/num_instances=1000/packed=false/latest_at_missing/primary/default 280 ns/iter (± 1) 279 ns/iter (± 0) 1.00
datastore/num_rows=1000/num_instances=1000/packed=false/latest_at_missing/secondaries/default 439 ns/iter (± 0) 435 ns/iter (± 0) 1.01
datastore/num_rows=1000/num_instances=1000/packed=false/latest_at_missing/primary/bucketsz=0 280 ns/iter (± 0) 279 ns/iter (± 0) 1.00
datastore/num_rows=1000/num_instances=1000/packed=false/latest_at_missing/secondaries/bucketsz=0 442 ns/iter (± 0) 443 ns/iter (± 0) 1.00
datastore/num_rows=1000/num_instances=1000/packed=false/latest_at_missing/primary/bucketsz=2 281 ns/iter (± 0) 279 ns/iter (± 0) 1.01
datastore/num_rows=1000/num_instances=1000/packed=false/latest_at_missing/secondaries/bucketsz=2 442 ns/iter (± 0) 444 ns/iter (± 0) 1.00
datastore/num_rows=1000/num_instances=1000/packed=false/latest_at_missing/primary/bucketsz=32 280 ns/iter (± 0) 279 ns/iter (± 0) 1.00
datastore/num_rows=1000/num_instances=1000/packed=false/latest_at_missing/secondaries/bucketsz=32 439 ns/iter (± 0) 440 ns/iter (± 0) 1.00
datastore/num_rows=1000/num_instances=1000/packed=false/latest_at_missing/primary/bucketsz=2048 280 ns/iter (± 0) 279 ns/iter (± 0) 1.00
datastore/num_rows=1000/num_instances=1000/packed=false/latest_at_missing/secondaries/bucketsz=2048 434 ns/iter (± 1) 436 ns/iter (± 0) 1.00
datastore/num_rows=1000/num_instances=1000/packed=true/latest_at_missing/primary/default 281 ns/iter (± 0) 279 ns/iter (± 0) 1.01
datastore/num_rows=1000/num_instances=1000/packed=true/latest_at_missing/secondaries/default 439 ns/iter (± 0) 438 ns/iter (± 0) 1.00
datastore/num_rows=1000/num_instances=1000/packed=true/latest_at_missing/primary/bucketsz=0 280 ns/iter (± 0) 278 ns/iter (± 0) 1.01
datastore/num_rows=1000/num_instances=1000/packed=true/latest_at_missing/secondaries/bucketsz=0 442 ns/iter (± 0) 443 ns/iter (± 0) 1.00
datastore/num_rows=1000/num_instances=1000/packed=true/latest_at_missing/primary/bucketsz=2 281 ns/iter (± 0) 278 ns/iter (± 0) 1.01
datastore/num_rows=1000/num_instances=1000/packed=true/latest_at_missing/secondaries/bucketsz=2 442 ns/iter (± 0) 443 ns/iter (± 0) 1.00
datastore/num_rows=1000/num_instances=1000/packed=true/latest_at_missing/primary/bucketsz=32 280 ns/iter (± 0) 279 ns/iter (± 0) 1.00
datastore/num_rows=1000/num_instances=1000/packed=true/latest_at_missing/secondaries/bucketsz=32 439 ns/iter (± 0) 440 ns/iter (± 0) 1.00
datastore/num_rows=1000/num_instances=1000/packed=true/latest_at_missing/primary/bucketsz=2048 281 ns/iter (± 0) 279 ns/iter (± 0) 1.01
datastore/num_rows=1000/num_instances=1000/packed=true/latest_at_missing/secondaries/bucketsz=2048 438 ns/iter (± 0) 437 ns/iter (± 5) 1.00
datastore/num_rows=1000/num_instances=1000/packed=false/range/default 13961222 ns/iter (± 716208) 15045488 ns/iter (± 716728) 0.93
datastore/num_rows=1000/num_instances=1000/packed=false/range/bucketsz=0 2257397 ns/iter (± 55096) 2185023 ns/iter (± 146517) 1.03
datastore/num_rows=1000/num_instances=1000/packed=false/range/bucketsz=2 2270465 ns/iter (± 91341) 2237585 ns/iter (± 70869) 1.01
datastore/num_rows=1000/num_instances=1000/packed=false/range/bucketsz=32 1915579 ns/iter (± 24701) 1930882 ns/iter (± 19864) 0.99
datastore/num_rows=1000/num_instances=1000/packed=false/range/bucketsz=2048 1897215 ns/iter (± 48073) 1860645 ns/iter (± 10489) 1.02
datastore/num_rows=1000/num_instances=1000/packed=true/range/default 11841810 ns/iter (± 742775) 11723287 ns/iter (± 755827) 1.01
datastore/num_rows=1000/num_instances=1000/packed=true/range/bucketsz=0 2227597 ns/iter (± 69857) 2130921 ns/iter (± 15375) 1.05
datastore/num_rows=1000/num_instances=1000/packed=true/range/bucketsz=2 2304404 ns/iter (± 119348) 2183148 ns/iter (± 63610) 1.06
datastore/num_rows=1000/num_instances=1000/packed=true/range/bucketsz=32 1934343 ns/iter (± 42744) 1845812 ns/iter (± 14449) 1.05
datastore/num_rows=1000/num_instances=1000/packed=true/range/bucketsz=2048 1832543 ns/iter (± 28719) 1802793 ns/iter (± 9603) 1.02
vector_ops/sort/instances=10000/smallvec/n=4 12428 ns/iter (± 35) 12494 ns/iter (± 18) 0.99
vector_ops/sort/instances=10000/tinyvec/n=4 9653 ns/iter (± 22) 9648 ns/iter (± 23) 1.00
vector_ops/sort/instances=10000/vec 9660 ns/iter (± 21) 9647 ns/iter (± 24) 1.00
vector_ops/split_off/instances=10000/smallvec/n=4/manual 5562 ns/iter (± 13) 5545 ns/iter (± 8) 1.00
vector_ops/split_off/instances=10000/tinyvec/n=4 2727 ns/iter (± 35) 2728 ns/iter (± 21) 1.00
vector_ops/split_off/instances=10000/tinyvec/n=4/manual 2745 ns/iter (± 16) 2737 ns/iter (± 20) 1.00
vector_ops/split_off/instances=10000/vec 2736 ns/iter (± 23) 2722 ns/iter (± 9) 1.01
vector_ops/split_off/instances=10000/vec/manual 2742 ns/iter (± 23) 2669 ns/iter (± 23) 1.03
vector_ops/swap/instances=10000/smallvec/n=4 32767 ns/iter (± 41) 32825 ns/iter (± 25) 1.00
vector_ops/swap/instances=10000/tinyvec/n=4 18303 ns/iter (± 16) 18267 ns/iter (± 39) 1.00
vector_ops/swap/instances=10000/vec 12308 ns/iter (± 13) 12305 ns/iter (± 11) 1.00
vector_ops/swap_opt/instances=10000/smallvec/n=4 42672 ns/iter (± 21) 42783 ns/iter (± 29) 1.00
vector_ops/swap_opt/instances=10000/tinyvec/n=4 28775 ns/iter (± 35) 28951 ns/iter (± 40) 0.99
vector_ops/swap_opt/instances=10000/vec 19787 ns/iter (± 36) 19877 ns/iter (± 24) 1.00
mono_points_arrow/generate_message_bundles 44372115 ns/iter (± 669061) 43786397 ns/iter (± 614340) 1.01
mono_points_arrow/generate_messages 134011405 ns/iter (± 1099244) 165142476 ns/iter (± 1100322) 0.81
mono_points_arrow/encode_log_msg 180489250 ns/iter (± 2330181) 208007785 ns/iter (± 1227384) 0.87
mono_points_arrow/encode_total 357357347 ns/iter (± 2299816) 416443519 ns/iter (± 4144644) 0.86
mono_points_arrow/decode_log_msg 212330777 ns/iter (± 776683) 256243054 ns/iter (± 2010532) 0.83
mono_points_arrow/decode_message_bundles 71767040 ns/iter (± 686274) 86437840 ns/iter (± 750776) 0.83
mono_points_arrow/decode_total 283068843 ns/iter (± 1325588) 340947320 ns/iter (± 2861077) 0.83
mono_points_arrow_batched/generate_message_bundles 34595113 ns/iter (± 1689003) 35865013 ns/iter (± 1159290) 0.96
mono_points_arrow_batched/generate_messages 6826677 ns/iter (± 574841) 9807303 ns/iter (± 549899) 0.70
mono_points_arrow_batched/encode_log_msg 1556589 ns/iter (± 8327) 1797241 ns/iter (± 3250) 0.87
mono_points_arrow_batched/encode_total 44855821 ns/iter (± 1419933) 48475411 ns/iter (± 1364836) 0.93
mono_points_arrow_batched/decode_log_msg 858042 ns/iter (± 2234) 988663 ns/iter (± 8610) 0.87
mono_points_arrow_batched/decode_message_bundles 11020570 ns/iter (± 432739) 19035605 ns/iter (± 949174) 0.58
mono_points_arrow_batched/decode_total 12819178 ns/iter (± 637428) 21353719 ns/iter (± 834984) 0.60
batch_points_arrow/generate_message_bundles 297772 ns/iter (± 876) 284873 ns/iter (± 757) 1.05
batch_points_arrow/generate_messages 5738 ns/iter (± 10) 7672 ns/iter (± 25) 0.75
batch_points_arrow/encode_log_msg 374970 ns/iter (± 1181) 389818 ns/iter (± 5572) 0.96
batch_points_arrow/encode_total 697789 ns/iter (± 2789) 693208 ns/iter (± 5658) 1.01
batch_points_arrow/decode_log_msg 352438 ns/iter (± 850) 340579 ns/iter (± 2354) 1.03
batch_points_arrow/decode_message_bundles 2202 ns/iter (± 7) 2938 ns/iter (± 8) 0.75
batch_points_arrow/decode_total 364184 ns/iter (± 1594) 354156 ns/iter (± 3837) 1.03
arrow_mono_points/insert 6065899456 ns/iter (± 14048132) 6198787871 ns/iter (± 109272271) 0.98
arrow_mono_points/query 1839528 ns/iter (± 13522) 1872440 ns/iter (± 23630) 0.98
arrow_batch_points/insert 3074367 ns/iter (± 22951) 3026018 ns/iter (± 17782) 1.02
arrow_batch_points/query 16400 ns/iter (± 37) 16424 ns/iter (± 26) 1.00
arrow_batch_vecs/insert 43219 ns/iter (± 168) 43032 ns/iter (± 172) 1.00
arrow_batch_vecs/query 506037 ns/iter (± 1809) 505899 ns/iter (± 369) 1.00
tuid/Tuid::random 40 ns/iter (± 0) 34 ns/iter (± 0) 1.18

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

Please sign in to comment.