This is an automated email from the ASF dual-hosted git repository.

etseidl pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-rs.git


The following commit(s) were added to refs/heads/main by this push:
     new 1a6630bc2c bench(coalesce): add specialized benchmarks for FSB, 
Boolean, FixedSizeList, and List (#11123)
1a6630bc2c is described below

commit 1a6630bc2c198955a9d24b34ca560dcbb9167a7f
Author: RIchard Baah <[email protected]>
AuthorDate: Thu Sep 17 16:42:39 2026 -0400

    bench(coalesce): add specialized benchmarks for FSB, Boolean, 
FixedSizeList, and List (#11123)
    
    # Which issue does this PR close?
    
    - Closes #N/A
    
    # Rationale for this change
    benchmarks striped out of #11122
    
    # What changes are included in this PR?
    
    - Add filter + take benchmarks for FixedSizeBinary(16/32), Boolean,
    FixedSizeList<Int32, 4>, and List<Int32>
    
    # Are these changes tested?
    n/a
    
    # Are there any user-facing changes?
    no
---
 arrow/benches/coalesce_kernels.rs | 197 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 197 insertions(+)

diff --git a/arrow/benches/coalesce_kernels.rs 
b/arrow/benches/coalesce_kernels.rs
index 2b0981efa9..b455b2d7d3 100644
--- a/arrow/benches/coalesce_kernels.rs
+++ b/arrow/benches/coalesce_kernels.rs
@@ -21,6 +21,8 @@ use arrow::util::bench_util::*;
 use std::sync::Arc;
 
 use arrow::array::*;
+use arrow_array::FixedSizeBinaryArray;
+use arrow_array::builder::FixedSizeBinaryBuilder;
 use arrow_array::types::{Float64Type, Int32Type, TimestampNanosecondType};
 use arrow_schema::{DataType, Field, Schema, SchemaRef, TimeUnit};
 use arrow_select::coalesce::BatchCoalescer;
@@ -103,6 +105,35 @@ fn add_all_filter_benchmarks(c: &mut Criterion) {
         // TODO model other dictionary types here (FixedSizeBinary for example)
     ]));
 
+    let single_fsb16_schema = SchemaRef::new(Schema::new(vec![Field::new(
+        "value",
+        DataType::FixedSizeBinary(16),
+        true,
+    )]));
+    let single_fsb32_schema = SchemaRef::new(Schema::new(vec![Field::new(
+        "value",
+        DataType::FixedSizeBinary(32),
+        true,
+    )]));
+
+    let single_boolean_schema = SchemaRef::new(Schema::new(vec![Field::new(
+        "value",
+        DataType::Boolean,
+        true,
+    )]));
+
+    let single_fsl4_schema = SchemaRef::new(Schema::new(vec![Field::new(
+        "value",
+        DataType::FixedSizeList(Arc::new(Field::new("item", DataType::Int32, 
true)), 4),
+        true,
+    )]));
+
+    let single_list_schema = SchemaRef::new(Schema::new(vec![Field::new(
+        "value",
+        DataType::List(Arc::new(Field::new("item", DataType::Int32, true))),
+        true,
+    )]));
+
     // Null density: 0, 10%
     for null_density in [0.0, 0.1] {
         // Selectivity: 0.1%, 1%, 10%, 80%
@@ -288,6 +319,66 @@ fn add_all_filter_benchmarks(c: &mut Criterion) {
                 schema: &mixed_dict_schema,
             }
             .build();
+
+            FilterBenchmarkBuilder {
+                c,
+                name: "single_fsb16",
+                batch_size,
+                num_output_batches: 50,
+                null_density,
+                selectivity,
+                max_string_len: 16,
+                schema: &single_fsb16_schema,
+            }
+            .build();
+
+            FilterBenchmarkBuilder {
+                c,
+                name: "single_fsb32",
+                batch_size,
+                num_output_batches: 50,
+                null_density,
+                selectivity,
+                max_string_len: 32,
+                schema: &single_fsb32_schema,
+            }
+            .build();
+
+            FilterBenchmarkBuilder {
+                c,
+                name: "single_boolean",
+                batch_size,
+                num_output_batches: 50,
+                null_density,
+                selectivity,
+                max_string_len: 0,
+                schema: &single_boolean_schema,
+            }
+            .build();
+
+            FilterBenchmarkBuilder {
+                c,
+                name: "single_fsl4",
+                batch_size,
+                num_output_batches: 50,
+                null_density,
+                selectivity,
+                max_string_len: 0,
+                schema: &single_fsl4_schema,
+            }
+            .build();
+
+            FilterBenchmarkBuilder {
+                c,
+                name: "single_list",
+                batch_size,
+                num_output_batches: 50,
+                null_density,
+                selectivity,
+                max_string_len: 0,
+                schema: &single_list_schema,
+            }
+            .build();
         }
     }
 }
@@ -354,6 +445,35 @@ fn add_all_take_benchmarks(c: &mut Criterion) {
         Field::new("float_val2", DataType::Float64, true),
     ]));
 
+    let single_fsb16_schema = SchemaRef::new(Schema::new(vec![Field::new(
+        "value",
+        DataType::FixedSizeBinary(16),
+        true,
+    )]));
+    let single_fsb32_schema = SchemaRef::new(Schema::new(vec![Field::new(
+        "value",
+        DataType::FixedSizeBinary(32),
+        true,
+    )]));
+
+    let single_boolean_schema = SchemaRef::new(Schema::new(vec![Field::new(
+        "value",
+        DataType::Boolean,
+        true,
+    )]));
+
+    let single_fsl4_schema = SchemaRef::new(Schema::new(vec![Field::new(
+        "value",
+        DataType::FixedSizeList(Arc::new(Field::new("item", DataType::Int32, 
true)), 4),
+        true,
+    )]));
+
+    let single_list_schema = SchemaRef::new(Schema::new(vec![Field::new(
+        "value",
+        DataType::List(Arc::new(Field::new("item", DataType::Int32, true))),
+        true,
+    )]));
+
     for null_density in [0.0, 0.1] {
         for selectivity in [0.001, 0.01, 0.1, 0.8] {
             for scenario in [
@@ -423,6 +543,36 @@ fn add_all_take_benchmarks(c: &mut Criterion) {
                     max_string_len: 30,
                     schema: &mixed_dict_schema,
                 },
+                TakeBenchmarkScenario {
+                    name: "single_fsb16",
+                    num_output_batches: 50,
+                    max_string_len: 16,
+                    schema: &single_fsb16_schema,
+                },
+                TakeBenchmarkScenario {
+                    name: "single_fsb32",
+                    num_output_batches: 50,
+                    max_string_len: 32,
+                    schema: &single_fsb32_schema,
+                },
+                TakeBenchmarkScenario {
+                    name: "single_boolean",
+                    num_output_batches: 50,
+                    max_string_len: 0,
+                    schema: &single_boolean_schema,
+                },
+                TakeBenchmarkScenario {
+                    name: "single_fsl4",
+                    num_output_batches: 50,
+                    max_string_len: 0,
+                    schema: &single_fsl4_schema,
+                },
+                TakeBenchmarkScenario {
+                    name: "single_list",
+                    num_output_batches: 50,
+                    max_string_len: 0,
+                    schema: &single_list_schema,
+                },
             ] {
                 TakeBenchmarkBuilder::from_scenario(
                     c,
@@ -1021,7 +1171,54 @@ impl DataStreamBuilder {
                     self.max_string_len,
                 )) // TODO seed
             }
+            DataType::FixedSizeBinary(size) => 
Arc::new(create_fixed_size_binary_array(
+                self.batch_size,
+                self.null_density,
+                *size,
+                seed,
+            )),
+            DataType::Boolean => Arc::new(create_boolean_array_with_seed(
+                self.batch_size,
+                self.null_density,
+                0.5,
+                seed,
+            )),
+            DataType::FixedSizeList(_, list_size) => {
+                Arc::new(create_primitive_fixed_size_list_array::<Int32Type>(
+                    self.batch_size,
+                    self.null_density,
+                    0.0,
+                    *list_size,
+                ))
+            }
+            DataType::List(_) => 
Arc::new(create_primitive_list_array_with_seed::<i32, Int32Type>(
+                self.batch_size,
+                self.null_density,
+                0.0,
+                10,
+                seed,
+            )),
             _ => panic!("Unsupported data type: {field:?}"),
         }
     }
 }
+
+fn create_fixed_size_binary_array(
+    batch_size: usize,
+    null_density: f32,
+    value_length: i32,
+    seed: u64,
+) -> FixedSizeBinaryArray {
+    let size = value_length as usize;
+    let mut rng = StdRng::seed_from_u64(seed);
+    let mut builder = FixedSizeBinaryBuilder::with_capacity(batch_size, 
value_length);
+    for _ in 0..batch_size {
+        if rng.random::<f32>() < null_density {
+            builder.append_null();
+        } else {
+            let value: Vec<u8> = (0..size).map(|_| 
rng.random::<u8>()).collect();
+            builder.append_value(&value).unwrap();
+        }
+    }
+    builder.finish()
+}

Reply via email to