From 544e8e47562614b8e57c4750df74fa4c7d1c45e6 Mon Sep 17 00:00:00 2001 From: ahmadalguydi Date: Fri, 7 Aug 2026 11:29:48 +0300 Subject: [PATCH 1/5] 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 d71dc9520b27274b7b8c088c1c74198220f416e9 Mon Sep 17 00:00:00 2001 From: ahmadalguydi Date: Sat, 8 Aug 2026 02:32:32 +0300 Subject: [PATCH 2/5] 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")] From 5e865322cbd2dac950e6990756d80dd5c01a3543 Mon Sep 17 00:00:00 2001 From: ahmad Date: Sun, 9 Aug 2026 12:45:27 +0300 Subject: [PATCH 3/5] Revert "bench: follow Vortex benchmark conventions" This reverts commit e1d387426e2339496c6a5ec0e76294b6d0d4ea16. Signed-off-by: ahmad --- vortex/benches/single_encoding_throughput.rs | 33 ++++++++++---------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/vortex/benches/single_encoding_throughput.rs b/vortex/benches/single_encoding_throughput.rs index 3e7ec5dbb9b..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,8 +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; -use vortex_buffer::BitBufferMut; +use vortex_buffer::{BitBuffer, BitBufferMut}; use vortex_error::VortexResult; use vortex_sequence::Sequence; use vortex_session::VortexSession; @@ -57,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> { @@ -274,22 +275,22 @@ fn bench_sequence_decompress_u32(bencher: Bencher) { .bench_refs(|(a, ctx)| canonicalize((**a).clone(), ctx)); } -#[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_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_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(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")] From 6cdc48ba60f9f8171b057e72ec656ada7d9e1f88 Mon Sep 17 00:00:00 2001 From: ahmad Date: Sun, 9 Aug 2026 12:47:19 +0300 Subject: [PATCH 4/5] chore: remove unrelated benchmark changes Signed-off-by: ahmad --- vortex/benches/single_encoding_throughput.rs | 22 -------------------- 1 file changed, 22 deletions(-) diff --git a/vortex/benches/single_encoding_throughput.rs b/vortex/benches/single_encoding_throughput.rs index de1307e788e..28e5ec721bf 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,6 @@ 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; @@ -57,8 +55,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> { #[cfg(not(codspeed))] @@ -275,24 +271,6 @@ 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 f325e4dadddb1b9cfa99107e8990df246a212b41 Mon Sep 17 00:00:00 2001 From: ahmad Date: Sun, 9 Aug 2026 12:47:39 +0300 Subject: [PATCH 5/5] style: restore benchmark file Signed-off-by: ahmad --- vortex/benches/single_encoding_throughput.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/vortex/benches/single_encoding_throughput.rs b/vortex/benches/single_encoding_throughput.rs index 28e5ec721bf..f2e201fb9b9 100644 --- a/vortex/benches/single_encoding_throughput.rs +++ b/vortex/benches/single_encoding_throughput.rs @@ -55,6 +55,7 @@ fn main() { } const NUM_VALUES: u64 = 100_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> { #[cfg(not(codspeed))]