Skip to content

Commit 8dc2ae7

Browse files
authored
Faster runend decompress (#2537)
Honestly... not sure why
1 parent 813d604 commit 8dc2ae7

File tree

5 files changed

+31
-4
lines changed

5 files changed

+31
-4
lines changed

Cargo.lock

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

encodings/runend/benches/run_end_compress.rs

+10-3
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22

33
use divan::Bencher;
44
use itertools::repeat_n;
5+
use num_traits::PrimInt;
56
use vortex_array::Array;
67
use vortex_array::arrays::PrimitiveArray;
78
use vortex_array::validity::Validity;
89
use vortex_buffer::Buffer;
10+
use vortex_dtype::NativePType;
911
use vortex_runend::RunEndArray;
1012
use vortex_runend::compress::runend_encode;
1113

@@ -38,13 +40,18 @@ fn compress(bencher: Bencher, (length, run_step): (usize, usize)) {
3840
.bench_refs(|values| runend_encode(values).unwrap());
3941
}
4042

41-
#[divan::bench(args = BENCH_ARGS)]
42-
fn decompress(bencher: Bencher, (length, run_step): (usize, usize)) {
43+
#[divan::bench(types = [u8, u16, u32, u64], args = BENCH_ARGS)]
44+
fn decompress<T: NativePType + PrimInt>(bencher: Bencher, (length, run_step): (usize, usize)) {
4345
let values = PrimitiveArray::new(
4446
(0..=length)
4547
.step_by(run_step)
4648
.enumerate()
47-
.flat_map(|(idx, x)| repeat_n(idx as u64, x))
49+
.flat_map(|(idx, x)| {
50+
repeat_n(
51+
T::from(idx % T::max_value().to_usize().unwrap()).unwrap(),
52+
x,
53+
)
54+
})
4855
.collect::<Buffer<_>>(),
4956
Validity::NonNullable,
5057
);

vortex-buffer/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ arrow-buffer = { workspace = true, optional = true }
2525
bytes = { workspace = true }
2626
compio = { workspace = true, optional = true }
2727
log = { workspace = true, optional = true }
28+
num-traits = { workspace = true }
2829
rkyv = { workspace = true, optional = true }
2930
vortex-error = { workspace = true }
3031

vortex-buffer/benches/vortex_buffer.rs

+17
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use std::iter::Iterator;
44

55
use arrow_buffer::{ArrowNativeType, MutableBuffer, ScalarBuffer};
66
use divan::Bencher;
7+
use num_traits::PrimInt;
78
use vortex_buffer::{Buffer, BufferMut};
89
use vortex_error::{VortexExpect, vortex_err};
910

@@ -108,3 +109,19 @@ fn push_arrow_buffer(bencher: Bencher, length: i32) {
108109
}
109110
});
110111
}
112+
113+
#[divan::bench(types = [u8, u16, u32, u64], args = [100, 1_000, 10_000, 100_000, 1_000_000])]
114+
fn push_n_vortex_buffer<T: PrimInt>(bencher: Bencher, length: usize) {
115+
bencher
116+
.with_inputs(|| BufferMut::<T>::with_capacity(length))
117+
.bench_refs(|buffer| {
118+
for _ in 0..100 {
119+
unsafe {
120+
buffer.push_n_unchecked(
121+
divan::black_box(T::one()),
122+
divan::black_box(length / 100),
123+
)
124+
};
125+
}
126+
});
127+
}

vortex-buffer/src/buffer_mut.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,8 @@ impl<T> BufferMut<T> {
293293
let mut dst: *mut T = self.bytes.spare_capacity_mut().as_mut_ptr().cast();
294294
// SAFETY: we checked the capacity in the reserve call
295295
unsafe {
296-
for _ in 0..n {
296+
let end = dst.add(n);
297+
while dst < end {
297298
dst.write(item);
298299
dst = dst.add(1);
299300
}

0 commit comments

Comments
 (0)