|
18 | 18 | //! Benchmarks for `with_hashes` function |
19 | 19 |
|
20 | 20 | use arrow::array::{ |
21 | | - Array, ArrayRef, ArrowPrimitiveType, DictionaryArray, GenericStringArray, Int32Array, |
22 | | - Int64Array, ListArray, MapArray, NullBufferBuilder, OffsetSizeTrait, PrimitiveArray, |
23 | | - RunArray, StringViewArray, StructArray, UnionArray, make_array, |
| 21 | + Array, ArrayRef, ArrowPrimitiveType, DictionaryArray, FixedSizeListArray, |
| 22 | + GenericStringArray, Int32Array, Int64Array, ListArray, ListViewArray, MapArray, |
| 23 | + NullArray, NullBufferBuilder, OffsetSizeTrait, PrimitiveArray, RunArray, |
| 24 | + StringViewArray, StructArray, UnionArray, make_array, |
24 | 25 | }; |
25 | 26 | use arrow::buffer::{NullBuffer, OffsetBuffer, ScalarBuffer}; |
26 | 27 | use arrow::datatypes::{ |
@@ -127,6 +128,21 @@ fn criterion_benchmark(c: &mut Criterion) { |
127 | 128 | array: create_run_array::<Int32Type>(BATCH_SIZE), |
128 | 129 | supports_nulls: true, |
129 | 130 | }, |
| 131 | + BenchData { |
| 132 | + name: "null", |
| 133 | + array: Arc::new(NullArray::new(BATCH_SIZE)), |
| 134 | + supports_nulls: false, |
| 135 | + }, |
| 136 | + BenchData { |
| 137 | + name: "list_view_array", |
| 138 | + array: list_view_array(BATCH_SIZE), |
| 139 | + supports_nulls: true, |
| 140 | + }, |
| 141 | + BenchData { |
| 142 | + name: "fixed_size_list_array", |
| 143 | + array: fixed_size_list_array(BATCH_SIZE), |
| 144 | + supports_nulls: true, |
| 145 | + }, |
130 | 146 | ]; |
131 | 147 |
|
132 | 148 | for BenchData { |
@@ -603,5 +619,49 @@ where |
603 | 619 | ) |
604 | 620 | } |
605 | 621 |
|
606 | | -criterion_group!(benches, criterion_benchmark, sliced_array_benchmark); |
| 622 | +fn list_view_array(num_rows: usize) -> ArrayRef { |
| 623 | + let elements_per_row = 5; |
| 624 | + let values = primitive_array::<Int64Type>(num_rows * elements_per_row); |
| 625 | + let offsets: ScalarBuffer<i32> = (0..num_rows) |
| 626 | + .map(|i| (i * elements_per_row) as i32) |
| 627 | + .collect(); |
| 628 | + let sizes: ScalarBuffer<i32> = |
| 629 | + (0..num_rows).map(|_| elements_per_row as i32).collect(); |
| 630 | + Arc::new(ListViewArray::new( |
| 631 | + Arc::new(Field::new("item", DataType::Int64, true)), |
| 632 | + offsets, |
| 633 | + sizes, |
| 634 | + values, |
| 635 | + None, |
| 636 | + )) |
| 637 | +} |
| 638 | + |
| 639 | +fn fixed_size_list_array(num_rows: usize) -> ArrayRef { |
| 640 | + let list_size = 4; |
| 641 | + Arc::new(FixedSizeListArray::new( |
| 642 | + Arc::new(Field::new("item", DataType::Int64, true)), |
| 643 | + list_size as i32, |
| 644 | + primitive_array::<Int64Type>(num_rows * list_size), |
| 645 | + None, |
| 646 | + )) |
| 647 | +} |
| 648 | + |
| 649 | +/// Heterogeneous key columns |
| 650 | +fn mixed_columns_benchmark(c: &mut Criterion) { |
| 651 | + let pool = StringPool::new(100, 64); |
| 652 | + let int64 = primitive_array::<Int64Type>(BATCH_SIZE); |
| 653 | + let utf8 = pool.string_array::<i32>(BATCH_SIZE); |
| 654 | + let utf8_view = pool.string_view_array(BATCH_SIZE); |
| 655 | + let arrays = vec![int64, utf8, utf8_view]; |
| 656 | + c.bench_function("mixed: 3 columns (int64, utf8, utf8_view)", |b| { |
| 657 | + do_hash_test(b, &arrays) |
| 658 | + }); |
| 659 | +} |
| 660 | + |
| 661 | +criterion_group!( |
| 662 | + benches, |
| 663 | + criterion_benchmark, |
| 664 | + sliced_array_benchmark, |
| 665 | + mixed_columns_benchmark |
| 666 | +); |
607 | 667 | criterion_main!(benches); |
0 commit comments