Skip to content

Commit f84c6b3

Browse files
authored
fix: benchmark input handling (#5488)
Inputs should be passed `with_inputs` to black box input args and benchmarked with `bench_refs` to exclude `drop`. Signed-off-by: Alexander Droste <[email protected]>
1 parent a917a39 commit f84c6b3

File tree

10 files changed

+188
-193
lines changed

10 files changed

+188
-193
lines changed

encodings/fastlanes/benches/bitpacking_decompress_selection.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,16 @@ fn decompress_bitpacking_early_filter<T: IntegerPType>(bencher: Bencher, fractio
3232
.collect::<BufferMut<T>>()
3333
.into_array()
3434
.to_primitive();
35-
3635
let array = bitpack_to_best_bit_width(&values).unwrap();
37-
3836
let mask = (0..100_000)
3937
.map(|_| rng.random_bool(fraction_kept))
4038
.collect();
41-
let mask = &Mask::from_buffer(mask);
4239

43-
bencher.bench(|| filter(array.as_ref(), mask).unwrap().to_canonical());
40+
let mask = Mask::from_buffer(mask);
41+
42+
bencher
43+
.with_inputs(|| (array.clone(), mask.clone()))
44+
.bench_refs(|(array, mask)| filter(array.as_ref(), mask).unwrap().to_canonical());
4445
}
4546

4647
// #[divan::bench(types = [i8, i16, i32, i64], args = [0.001, 0.01, 0.1, 0.5, 0.9, 0.99, 0.999])]
@@ -58,9 +59,10 @@ fn decompress_bitpacking_late_filter<T: IntegerPType>(bencher: Bencher, fraction
5859
let mask = (0..100_000)
5960
.map(|_| rng.random_bool(fraction_kept))
6061
.collect();
61-
let mask = &Mask::from_buffer(mask);
62+
63+
let mask = Mask::from_buffer(mask);
6264

6365
bencher
64-
.with_inputs(|| array.clone())
65-
.bench_values(|array| filter(array.to_canonical().as_ref(), mask).unwrap());
66+
.with_inputs(|| (array.clone(), mask.clone()))
67+
.bench_refs(|(array, mask)| filter(array.to_canonical().as_ref(), mask).unwrap());
6668
}

encodings/fastlanes/benches/canonicalize_bench.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ fn into_canonical_non_nullable(
4646

4747
bencher
4848
.with_inputs(|| chunked.clone())
49-
.bench_values(|chunked| chunked.to_canonical());
49+
.bench_refs(|chunked| chunked.to_canonical());
5050
}
5151

5252
#[divan::bench(args = BENCH_ARGS)]
@@ -65,7 +65,7 @@ fn canonical_into_non_nullable(
6565

6666
bencher
6767
.with_inputs(|| chunked.clone())
68-
.bench_values(|chunked| {
68+
.bench_refs(|chunked| {
6969
let mut primitive_builder = PrimitiveBuilder::<i32>::with_capacity(
7070
chunked.dtype().nullability(),
7171
chunk_len * chunk_count,
@@ -102,7 +102,7 @@ fn into_canonical_nullable(
102102

103103
bencher
104104
.with_inputs(|| chunked.clone())
105-
.bench_values(|chunked| chunked.to_canonical());
105+
.bench_refs(|chunked| chunked.to_canonical());
106106
}
107107

108108
#[divan::bench(args = NULLABLE_BENCH_ARGS)]
@@ -122,7 +122,7 @@ fn canonical_into_nullable(
122122

123123
bencher
124124
.with_inputs(|| chunked.clone())
125-
.bench_values(|chunked| {
125+
.bench_refs(|chunked| {
126126
let mut primitive_builder = PrimitiveBuilder::<i32>::with_capacity(
127127
chunked.dtype().nullability(),
128128
chunk_len * chunk_count,

encodings/fastlanes/benches/compute_between.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ mod primitive {
8686
let mut rng = StdRng::seed_from_u64(0);
8787
let arr = generate_primitive_array::<T>(&mut rng, len);
8888

89-
bencher.with_inputs(|| arr.clone()).bench_values(|arr| {
89+
bencher.with_inputs(|| arr.clone()).bench_refs(|arr| {
9090
boolean(
9191
&compare(
9292
arr.as_ref(),
@@ -120,7 +120,7 @@ mod primitive {
120120
let mut rng = StdRng::seed_from_u64(0);
121121
let arr = generate_primitive_array::<T>(&mut rng, len);
122122

123-
bencher.with_inputs(|| arr.clone()).bench_values(|arr| {
123+
bencher.with_inputs(|| arr.clone()).bench_refs(|arr| {
124124
between(
125125
arr.as_ref(),
126126
ConstantArray::new(min, arr.len()).as_ref(),
@@ -164,7 +164,7 @@ mod bitpack {
164164
let mut rng = StdRng::seed_from_u64(0);
165165
let arr = generate_bit_pack_primitive_array::<T>(&mut rng, len);
166166

167-
bencher.with_inputs(|| arr.clone()).bench_values(|arr| {
167+
bencher.with_inputs(|| arr.clone()).bench_refs(|arr| {
168168
boolean(
169169
&compare(
170170
arr.as_ref(),
@@ -197,7 +197,7 @@ mod bitpack {
197197
let mut rng = StdRng::seed_from_u64(0);
198198
let arr = generate_bit_pack_primitive_array::<T>(&mut rng, len);
199199

200-
bencher.with_inputs(|| arr.clone()).bench_values(|arr| {
200+
bencher.with_inputs(|| arr.clone()).bench_refs(|arr| {
201201
between(
202202
arr.as_ref(),
203203
ConstantArray::new(min, arr.len()).as_ref(),
@@ -240,7 +240,7 @@ mod alp {
240240
let mut rng = StdRng::seed_from_u64(0);
241241
let arr = generate_alp_bit_pack_primitive_array::<T>(&mut rng, len);
242242

243-
bencher.with_inputs(|| arr.clone()).bench_values(|arr| {
243+
bencher.with_inputs(|| arr.clone()).bench_refs(|arr| {
244244
boolean(
245245
&compare(
246246
arr.as_ref(),
@@ -273,7 +273,7 @@ mod alp {
273273
let mut rng = StdRng::seed_from_u64(0);
274274
let arr = generate_alp_bit_pack_primitive_array::<T>(&mut rng, len);
275275

276-
bencher.with_inputs(|| arr.clone()).bench_values(|arr| {
276+
bencher.with_inputs(|| arr.clone()).bench_refs(|arr| {
277277
between(
278278
arr.as_ref(),
279279
ConstantArray::new(min, arr.len()).as_ref(),

encodings/fastlanes/benches/pipeline_bitpacking.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ pub fn decompress_bitpacking_early_filter<T: NativePType>(bencher: Bencher, frac
4343
bencher
4444
// Be sure to reconstruct the mask to avoid cached set_indices
4545
.with_inputs(|| Mask::from_buffer(mask.clone()))
46-
.bench_local_values(|mask| filter(array.as_ref(), &mask).unwrap().to_canonical());
46+
.bench_refs(|mask| filter(array.as_ref(), mask).unwrap().to_canonical());
4747
}
4848

4949
#[divan::bench(types = [i8, i16, i32, i64], args = TRUE_COUNT)]
@@ -63,7 +63,7 @@ pub fn decompress_bitpacking_late_filter<T: NativePType>(bencher: Bencher, fract
6363

6464
bencher
6565
.with_inputs(|| Mask::from_buffer(mask.clone()))
66-
.bench_values(|mask| filter(array.to_canonical().as_ref(), &mask).unwrap());
66+
.bench_refs(|mask| filter(array.to_canonical().as_ref(), mask).unwrap());
6767
}
6868

6969
#[divan::bench(types = [i8, i16, i32, i64], args = TRUE_COUNT)]
@@ -82,5 +82,5 @@ pub fn decompress_bitpacking_pipeline_filter<T: NativePType>(bencher: Bencher, f
8282

8383
bencher
8484
.with_inputs(|| Mask::from(mask.clone()))
85-
.bench_local_values(|mask| array.execute_with_selection(&mask).unwrap());
85+
.bench_refs(|mask| array.execute_with_selection(mask).unwrap());
8686
}

encodings/fastlanes/benches/pipeline_bitpacking_compare_scalar.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,9 @@ pub fn eval<T: NativePType + Into<Scalar>>(bencher: Bencher, fraction_kept: f64)
6565
bencher
6666
// Be sure to reconstruct the mask to avoid cached set_indices
6767
.with_inputs(|| (Mask::from_buffer(mask.clone()), array.clone()))
68-
.bench_local_values(|(mask, array)| {
68+
.bench_refs(|(mask, array)| {
6969
// We run the filter first, then compare.
70-
let array = filter(array.as_ref(), &mask).unwrap();
70+
let array = filter(array.as_ref(), mask).unwrap();
7171
expr.evaluate(&array).unwrap().to_canonical()
7272
});
7373
}

encodings/fastlanes/benches/pipeline_for.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ pub fn decompress_for_early_filter<T: NativePType>(bencher: Bencher, fraction_ke
6464

6565
bencher
6666
.with_inputs(|| Mask::from_buffer(mask.clone()))
67-
.bench_local_values(|mask| filter(array.as_ref(), &mask).unwrap().to_canonical());
67+
.bench_refs(|mask| filter(array.as_ref(), mask).unwrap().to_canonical());
6868
}
6969

7070
// TODO(ngates): bring back benchmarks once operator API is stable.

encodings/fastlanes/benches/pipeline_rle.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,5 +71,5 @@ fn decompress<T: IntegerPType>(bencher: Bencher, (length, run_step): (usize, usi
7171

7272
bencher
7373
.with_inputs(|| rle_array.clone())
74-
.bench_values(|rle_array| rle_array.to_canonical());
74+
.bench_refs(|rle_array| rle_array.to_canonical());
7575
}

encodings/fastlanes/benches/pipeline_v2_bitpacking_basic.rs

Lines changed: 26 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -30,46 +30,42 @@ const BENCH_PARAMS: &[(usize, f64)] = &[
3030

3131
#[divan::bench(args = BENCH_PARAMS)]
3232
fn bitpack_pipeline_unpack(bencher: Bencher, (num_elements, validity_pct): (usize, f64)) {
33-
bencher
34-
.with_inputs(|| {
35-
let mut rng = StdRng::seed_from_u64(42);
33+
let mut rng = StdRng::seed_from_u64(42);
3634

37-
// Create array with randomized validity.
38-
// Keep values small enough to fit in the bit width (0-1023 for 10 bits).
39-
let values = (0..num_elements).map(|_| {
40-
let is_valid = rng.random_bool(validity_pct);
41-
is_valid.then(|| rng.random_range(0u32..1024))
42-
});
35+
// Create array with randomized validity.
36+
// Keep values small enough to fit in the bit width (0-1023 for 10 bits).
37+
let values = (0..num_elements).map(|_| {
38+
let is_valid = rng.random_bool(validity_pct);
39+
is_valid.then(|| rng.random_range(0u32..1024))
40+
});
4341

44-
let primitive = PrimitiveArray::from_option_iter(values).to_array();
42+
let primitive = PrimitiveArray::from_option_iter(values).to_array();
4543

46-
// Encode with 10-bit width (supports values up to 1023).
47-
let bitpacked = BitPackedArray::encode(&primitive, 10).unwrap();
44+
// Encode with 10-bit width (supports values up to 1023).
45+
let bitpacked = BitPackedArray::encode(&primitive, 10).unwrap();
4846

49-
bitpacked.to_array()
50-
})
51-
.bench_local_values(|array| array.execute().unwrap());
47+
bencher
48+
.with_inputs(|| bitpacked.to_array())
49+
.bench_refs(|array| array.execute().unwrap());
5250
}
5351

5452
#[divan::bench(args = BENCH_PARAMS)]
5553
fn bitpack_canonical_unpack(bencher: Bencher, (num_elements, validity_pct): (usize, f64)) {
56-
bencher
57-
.with_inputs(|| {
58-
let mut rng = StdRng::seed_from_u64(42);
54+
let mut rng = StdRng::seed_from_u64(42);
5955

60-
// Create array with randomized validity.
61-
// Keep values small enough to fit in the bit width (0-1023 for 10 bits).
62-
let values = (0..num_elements).map(|_| {
63-
let is_valid = rng.random_bool(validity_pct);
64-
is_valid.then(|| rng.random_range(0u32..1024))
65-
});
56+
// Create array with randomized validity.
57+
// Keep values small enough to fit in the bit width (0-1023 for 10 bits).
58+
let values = (0..num_elements).map(|_| {
59+
let is_valid = rng.random_bool(validity_pct);
60+
is_valid.then(|| rng.random_range(0u32..1024))
61+
});
6662

67-
let primitive = PrimitiveArray::from_option_iter(values).to_array();
63+
let primitive = PrimitiveArray::from_option_iter(values).to_array();
6864

69-
// Encode with 10-bit width (supports values up to 1023).
70-
let bitpacked = BitPackedArray::encode(&primitive, 10).unwrap();
65+
// Encode with 10-bit width (supports values up to 1023).
66+
let bitpacked = BitPackedArray::encode(&primitive, 10).unwrap();
7167

72-
bitpacked.to_array()
73-
})
74-
.bench_local_values(|array| array.to_canonical());
68+
bencher
69+
.with_inputs(|| bitpacked.to_array())
70+
.bench_refs(|array| array.to_canonical());
7571
}

encodings/runend/benches/run_end_filter.rs

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,23 +42,20 @@ const BENCH_ARGS: &[(usize, usize, f64)] = &[
4242

4343
#[divan::bench(args = BENCH_ARGS)]
4444
fn take_indices(bencher: Bencher, (n, run_step, filter_density): (usize, usize, f64)) {
45-
let (array, mask) = fixture(n, run_step, filter_density);
46-
47-
let indices = mask.values().unwrap().indices();
48-
4945
bencher
50-
.with_inputs(|| (&array, indices))
46+
.with_inputs(|| {
47+
let (array, mask) = fixture(n, run_step, filter_density);
48+
(array, mask.values().unwrap().indices().to_owned())
49+
})
5150
.bench_refs(|(array, indices)| {
5251
take_indices_unchecked(array, indices, &Validity::NonNullable).unwrap()
5352
});
5453
}
5554

5655
#[divan::bench(args = BENCH_ARGS)]
5756
fn filter_runend(bencher: Bencher, (n, run_step, filter_density): (usize, usize, f64)) {
58-
let (array, mask) = fixture(n, run_step, filter_density);
59-
6057
bencher
61-
.with_inputs(|| (&array, &mask))
58+
.with_inputs(|| fixture(n, run_step, filter_density))
6259
.bench_refs(|(array, mask)| filter_run_end(array, mask).unwrap());
6360
}
6461

0 commit comments

Comments
 (0)