From 404296ad86ce3089f2ef032496ea3f2be85766be Mon Sep 17 00:00:00 2001 From: ahmadalguydi Date: Fri, 7 Aug 2026 11:29:48 +0300 Subject: [PATCH 1/2] optimize sequence compare match bitmap Signed-off-by: ahmad --- encodings/sequence/src/compute/compare.rs | 6 ++++-- vortex/benches/single_encoding_throughput.rs | 21 ++++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/encodings/sequence/src/compute/compare.rs b/encodings/sequence/src/compute/compare.rs index 5895330ea81..612334d3441 100644 --- a/encodings/sequence/src/compute/compare.rs +++ b/encodings/sequence/src/compute/compare.rs @@ -14,7 +14,7 @@ use vortex_array::scalar::PValue; use vortex_array::scalar::Scalar; use vortex_array::scalar_fn::fns::binary::CompareKernel; use vortex_array::scalar_fn::fns::operators::CompareOperator; -use vortex_buffer::BitBuffer; +use vortex_buffer::BitBufferMut; use vortex_error::VortexExpect; use vortex_error::VortexResult; use vortex_error::vortex_bail; @@ -56,7 +56,9 @@ impl CompareKernel for Sequence { }; if let Ok(set_idx) = set_idx { - let buffer = BitBuffer::from_iter((0..lhs.len()).map(|idx| idx == set_idx)); + let mut buffer = BitBufferMut::new_unset(lhs.len()); + buffer.set(set_idx); + let buffer = buffer.freeze(); Ok(Some(BoolArray::new(buffer, validity).into_array())) } else { Ok(Some( diff --git a/vortex/benches/single_encoding_throughput.rs b/vortex/benches/single_encoding_throughput.rs index f2e201fb9b9..de1307e788e 100644 --- a/vortex/benches/single_encoding_throughput.rs +++ b/vortex/benches/single_encoding_throughput.rs @@ -4,6 +4,7 @@ #![expect(clippy::unwrap_used)] #![expect(clippy::cast_possible_truncation)] +use std::hint::black_box; use std::sync::LazyLock; use divan::Bencher; @@ -40,6 +41,7 @@ use vortex::encodings::zigzag::zigzag_encode; use vortex::encodings::zstd::Zstd; use vortex::encodings::zstd::ZstdData; use vortex_array::VortexSessionExecute; +use vortex_buffer::{BitBuffer, BitBufferMut}; use vortex_error::VortexResult; use vortex_sequence::Sequence; use vortex_session::VortexSession; @@ -55,6 +57,7 @@ fn main() { } const NUM_VALUES: u64 = 100_000; +const SEQUENCE_COMPARE_LENGTHS: [usize; 3] = [1_000, 100_000, 1_000_000]; // Helper function to conditionally add counter based on codspeed cfg fn with_byte_counter<'a, 'b>(bencher: Bencher<'a, 'b>, bytes: u64) -> Bencher<'a, 'b> { @@ -272,6 +275,24 @@ fn bench_sequence_decompress_u32(bencher: Bencher) { .bench_refs(|(a, ctx)| canonicalize((**a).clone(), ctx)); } +#[divan::bench(args = SEQUENCE_COMPARE_LENGTHS)] +fn bench_sequence_compare_match_from_iter(bencher: Bencher, len: usize) { + let set_idx = len / 2; + bencher.bench(|| { + black_box(BitBuffer::from_iter((0..len).map(|idx| idx == set_idx))); + }); +} + +#[divan::bench(args = SEQUENCE_COMPARE_LENGTHS)] +fn bench_sequence_compare_match_single_set(bencher: Bencher, len: usize) { + let set_idx = len / 2; + bencher.bench(|| { + let mut buffer = BitBufferMut::new_unset(len); + buffer.set(set_idx); + black_box(buffer.freeze()); + }); +} + #[divan::bench(name = "alp_compress_f64")] fn bench_alp_compress_f64(bencher: Bencher) { let (_, _, float_array) = setup_primitive_arrays(); From e1d387426e2339496c6a5ec0e76294b6d0d4ea16 Mon Sep 17 00:00:00 2001 From: ahmadalguydi Date: Sat, 8 Aug 2026 02:32:32 +0300 Subject: [PATCH 2/2] bench: follow Vortex benchmark conventions Signed-off-by: ahmad --- vortex/benches/single_encoding_throughput.rs | 33 ++++++++++---------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/vortex/benches/single_encoding_throughput.rs b/vortex/benches/single_encoding_throughput.rs index de1307e788e..3e7ec5dbb9b 100644 --- a/vortex/benches/single_encoding_throughput.rs +++ b/vortex/benches/single_encoding_throughput.rs @@ -4,7 +4,6 @@ #![expect(clippy::unwrap_used)] #![expect(clippy::cast_possible_truncation)] -use std::hint::black_box; use std::sync::LazyLock; use divan::Bencher; @@ -41,7 +40,8 @@ use vortex::encodings::zigzag::zigzag_encode; use vortex::encodings::zstd::Zstd; use vortex::encodings::zstd::ZstdData; use vortex_array::VortexSessionExecute; -use vortex_buffer::{BitBuffer, BitBufferMut}; +use vortex_buffer::BitBuffer; +use vortex_buffer::BitBufferMut; use vortex_error::VortexResult; use vortex_sequence::Sequence; use vortex_session::VortexSession; @@ -57,7 +57,6 @@ fn main() { } const NUM_VALUES: u64 = 100_000; -const SEQUENCE_COMPARE_LENGTHS: [usize; 3] = [1_000, 100_000, 1_000_000]; // Helper function to conditionally add counter based on codspeed cfg fn with_byte_counter<'a, 'b>(bencher: Bencher<'a, 'b>, bytes: u64) -> Bencher<'a, 'b> { @@ -275,22 +274,22 @@ fn bench_sequence_decompress_u32(bencher: Bencher) { .bench_refs(|(a, ctx)| canonicalize((**a).clone(), ctx)); } -#[divan::bench(args = SEQUENCE_COMPARE_LENGTHS)] -fn bench_sequence_compare_match_from_iter(bencher: Bencher, len: usize) { - let set_idx = len / 2; - bencher.bench(|| { - black_box(BitBuffer::from_iter((0..len).map(|idx| idx == set_idx))); - }); +#[divan::bench] +fn bench_sequence_compare_match_from_iter(bencher: Bencher) { + bencher + .with_inputs(|| (NUM_VALUES as usize, NUM_VALUES as usize / 2)) + .bench_values(|(len, set_idx)| BitBuffer::from_iter((0..len).map(|idx| idx == set_idx))); } -#[divan::bench(args = SEQUENCE_COMPARE_LENGTHS)] -fn bench_sequence_compare_match_single_set(bencher: Bencher, len: usize) { - let set_idx = len / 2; - bencher.bench(|| { - let mut buffer = BitBufferMut::new_unset(len); - buffer.set(set_idx); - black_box(buffer.freeze()); - }); +#[divan::bench] +fn bench_sequence_compare_match_single_set(bencher: Bencher) { + bencher + .with_inputs(|| (NUM_VALUES as usize, NUM_VALUES as usize / 2)) + .bench_values(|(len, set_idx)| { + let mut buffer = BitBufferMut::new_unset(len); + buffer.set(set_idx); + buffer.freeze() + }); } #[divan::bench(name = "alp_compress_f64")]