From 580a1e174f4327f9aed2be03cb92c7e747977dc6 Mon Sep 17 00:00:00 2001 From: Andrew Lamb Date: Wed, 22 Apr 2026 10:48:48 -0400 Subject: [PATCH 1/2] Prune redundant benchmarks in cast_kernels --- arrow/benches/cast_kernels.rs | 344 +--------------------------------- 1 file changed, 8 insertions(+), 336 deletions(-) diff --git a/arrow/benches/cast_kernels.rs b/arrow/benches/cast_kernels.rs index 2af3145a84e1..07cf02a71a68 100644 --- a/arrow/benches/cast_kernels.rs +++ b/arrow/benches/cast_kernels.rs @@ -83,36 +83,6 @@ fn build_utf8_date_time_array(size: usize, with_nulls: bool) -> ArrayRef { Arc::new(builder.finish()) } -fn build_decimal32_array(size: usize, precision: u8, scale: i8) -> ArrayRef { - let mut rng = seedable_rng(); - let mut builder = Decimal32Builder::with_capacity(size); - - for _ in 0..size { - builder.append_value(rng.random_range::(0..1000000)); - } - Arc::new( - builder - .finish() - .with_precision_and_scale(precision, scale) - .unwrap(), - ) -} - -fn build_decimal64_array(size: usize, precision: u8, scale: i8) -> ArrayRef { - let mut rng = seedable_rng(); - let mut builder = Decimal64Builder::with_capacity(size); - - for _ in 0..size { - builder.append_value(rng.random_range::(0..1000000000)); - } - Arc::new( - builder - .finish() - .with_precision_and_scale(precision, scale) - .unwrap(), - ) -} - fn build_decimal128_array(size: usize, precision: u8, scale: i8) -> ArrayRef { let mut rng = seedable_rng(); let mut builder = Decimal128Builder::with_capacity(size); @@ -175,6 +145,14 @@ fn build_string_float_array(size: usize, null_density: f32) -> ArrayRef { Arc::new(builder.finish()) } +fn build_float64_array_for_cast_to_decimal(size: usize, null_density: f32) -> ArrayRef { + Arc::new(create_primitive_array_range::( + size, + null_density, + -999_999_999f64..999_999_999f64, + )) +} + macro_rules! build_array_with_samples { ($builder: ident, $size: ident, $null_density: expr, $samples: ident) => {{ let mut rng = seedable_rng(); @@ -189,46 +167,6 @@ macro_rules! build_array_with_samples { }}; } -fn build_string_float_array_invalid_item(size: usize, null_density: f32) -> ArrayRef { - let invalid_items = [ - "--1.23", - "1.2.3", - "-1.-23499", - "--1.23456789", - "1-.234", - "e10", - "1e", - "1e++10", - "NaN", - "Infinity", - ]; - let mut builder = StringBuilder::new(); - build_array_with_samples!(builder, size, null_density, invalid_items) -} - -fn build_float32_array_for_cast_to_decimal(size: usize, null_density: f32) -> ArrayRef { - Arc::new(create_primitive_array_range::( - size, - null_density, - -999_999_999f32..999_999_999f32, - )) -} - -fn build_float64_array_for_cast_to_decimal(size: usize, null_density: f32) -> ArrayRef { - Arc::new(create_primitive_array_range::( - size, - null_density, - -999_999_999f64..999_999_999f64, - )) -} - -fn build_float32_array_invalid_item(size: usize, null_density: f32) -> ArrayRef { - let mut builder = Float32Builder::with_capacity(size); - let invalid_values = [f32::NAN, f32::INFINITY, f32::NEG_INFINITY]; - - build_array_with_samples!(builder, size, null_density, invalid_values) -} - fn build_float64_array_invalid_items(size: usize, null_density: f32) -> ArrayRef { let mut builder = Float64Builder::with_capacity(size); let invalid_values = [f64::NAN, f64::INFINITY, f64::NEG_INFINITY]; @@ -268,8 +206,6 @@ fn add_benchmark(c: &mut Criterion) { let utf8_date_array = build_utf8_date_array(512, true); let utf8_date_time_array = build_utf8_date_time_array(512, true); - let decimal32_array = build_decimal32_array(8_000, 9, 3); - let decimal64_array = build_decimal64_array(8_000, 10, 3); let decimal128_array = build_decimal128_array(8_000, 10, 3); let decimal256_array = build_decimal256_array(8_000, 50, 3); let string_array = build_string_array(512); @@ -280,10 +216,7 @@ fn add_benchmark(c: &mut Criterion) { let binary_view_array = cast(&string_view_array, &DataType::BinaryView).unwrap(); let string_float_array_normal = build_string_float_array(5_000, 0.1); - let invalid_string_float_array = build_string_float_array_invalid_item(8_000, 0.1); - let float32_array_cast_to_decimal = build_float32_array_for_cast_to_decimal(8_000, 0.1); let float64_array_cast_to_decimal = build_float64_array_for_cast_to_decimal(8_000, 0.1); - let invalid_float32_array_to_decimal = build_float32_array_invalid_item(8_000, 0.1); let invalid_float64_array_to_decimal = build_float64_array_invalid_items(8_000, 0.1); c.bench_function("cast int32 to int32 512", |b| { @@ -366,22 +299,6 @@ fn add_benchmark(c: &mut Criterion) { b.iter(|| cast_array(&utf8_date_time_array, DataType::Date64)) }); - c.bench_function("cast decimal32 to decimal32 512", |b| { - b.iter(|| cast_array(&decimal32_array, DataType::Decimal32(9, 4))) - }); - c.bench_function("cast decimal32 to decimal32 512 lower precision", |b| { - b.iter(|| cast_array(&decimal32_array, DataType::Decimal32(6, 5))) - }); - c.bench_function("cast decimal32 to decimal64 512", |b| { - b.iter(|| cast_array(&decimal32_array, DataType::Decimal64(11, 5))) - }); - c.bench_function("cast decimal64 to decimal32 512", |b| { - b.iter(|| cast_array(&decimal64_array, DataType::Decimal32(9, 2))) - }); - c.bench_function("cast decimal64 to decimal64 512", |b| { - b.iter(|| cast_array(&decimal64_array, DataType::Decimal64(12, 4))) - }); - c.bench_function("cast decimal128 to decimal128 512", |b| { b.iter(|| cast_array(&decimal128_array, DataType::Decimal128(30, 5))) }); @@ -455,288 +372,43 @@ fn add_benchmark(c: &mut Criterion) { } // cast string with normal items to decimals - benchmark_cast!( - "cast string to decimal32(9, 2)", - string_float_array_normal, - DataType::Decimal32(9, 2) - ); - benchmark_cast!( - "cast string to decimal64(18, 2)", - string_float_array_normal, - DataType::Decimal64(18, 2) - ); benchmark_cast!( "cast string to decimal128(38, 3)", string_float_array_normal, DataType::Decimal128(38, 3) ); - benchmark_cast!( - "cast string to decimal256(76, 4)", - string_float_array_normal, - DataType::Decimal256(76, 4) - ); - - // cast invalid string to decimals - benchmark_cast!( - "cast invalid string to decimal32(9, 2)", - invalid_string_float_array, - DataType::Decimal32(9, 2) - ); - benchmark_cast!( - "cast invalid string to decimal64(18, 2)", - invalid_string_float_array, - DataType::Decimal64(18, 2) - ); - benchmark_cast!( - "cast invalid string to decimal128(38, 3)", - invalid_string_float_array, - DataType::Decimal128(38, 3) - ); - benchmark_cast!( - "cast invalid string to decimal256(76, 4)", - invalid_string_float_array, - DataType::Decimal256(76, 4) - ); - - // cast float32 to decimals - benchmark_cast!( - "cast float32 to decimal32(9, 2)", - float32_array_cast_to_decimal, - DataType::Decimal32(9, 2) - ); - benchmark_cast!( - "cast float32 to decimal64(18, 2", - float32_array_cast_to_decimal, - DataType::Decimal64(18, 2) - ); - benchmark_cast!( - "cast float32 to decimal128(32, 3)", - float32_array_cast_to_decimal, - DataType::Decimal128(38, 3) - ); - benchmark_cast!( - "cast float32 to decimal256(76, 4)", - float32_array_cast_to_decimal, - DataType::Decimal256(76, 4) - ); - - // cast invalid float32 to decimals - benchmark_cast!( - "cast invalid float32 to decimal32(9, 2)", - invalid_float32_array_to_decimal, - DataType::Decimal32(9, 2) - ); - benchmark_cast!( - "cast invalid float32 to decimal64(18, 2", - invalid_float32_array_to_decimal, - DataType::Decimal64(18, 2) - ); - benchmark_cast!( - "cast invalid float32 to decimal128(32, 3)", - invalid_float32_array_to_decimal, - DataType::Decimal128(32, 3) - ); - benchmark_cast!( - "cast invalid float32 to decimal256(76, 4)", - invalid_float32_array_to_decimal, - DataType::Decimal256(76, 4) - ); // cast float64 to decimals - benchmark_cast!( - "cast float64 to decimal32(9, 2)", - float64_array_cast_to_decimal, - DataType::Decimal32(9, 2) - ); - benchmark_cast!( - "cast float64 to decimal64(18, 2", - float64_array_cast_to_decimal, - DataType::Decimal64(18, 2) - ); benchmark_cast!( "cast float64 to decimal128(32, 3)", float64_array_cast_to_decimal, DataType::Decimal128(32, 3) ); - benchmark_cast!( - "cast float64 to decimal256(76, 4)", - float64_array_cast_to_decimal, - DataType::Decimal256(76, 4) - ); // cast invalid float64 to decimals - benchmark_cast!( - "cast invalid float64 to decimal32(9, 2)", - invalid_float64_array_to_decimal, - DataType::Decimal32(9, 2) - ); - benchmark_cast!( - "cast invalid float64 to to decimal64(18, 2)", - invalid_float64_array_to_decimal, - DataType::Decimal64(18, 2) - ); benchmark_cast!( "cast invalid float64 to to decimal128(32, 3)", invalid_float64_array_to_decimal, DataType::Decimal128(32, 3) ); - benchmark_cast!( - "cast invalid float64 to to decimal256(76, 4)", - invalid_float64_array_to_decimal, - DataType::Decimal256(76, 4) - ); // cast decimals to float/integers - benchmark_cast!( - "cast decimal32 to float32", - decimal32_array, - DataType::Float32 - ); - benchmark_cast!( - "cast decimal32 to float64", - decimal32_array, - DataType::Float64 - ); - benchmark_cast!("cast decimal32 to uint8", decimal32_array, DataType::UInt8); - benchmark_cast!( - "cast decimal32 to uint16", - decimal32_array, - DataType::UInt16 - ); - benchmark_cast!( - "cast decimal32 to uint32", - decimal32_array, - DataType::UInt32 - ); - benchmark_cast!( - "cast decimal32 to uint64", - decimal32_array, - DataType::UInt64 - ); - benchmark_cast!("cast decimal32 to int8", decimal32_array, DataType::Int8); - benchmark_cast!("cast decimal32 to int16", decimal32_array, DataType::Int16); - benchmark_cast!("cast decimal32 to int32", decimal32_array, DataType::Int32); - benchmark_cast!("cast decimal32 to int64", decimal32_array, DataType::Int64); - - benchmark_cast!( - "cast decimal64 to float32", - decimal64_array, - DataType::Float32 - ); - benchmark_cast!( - "cast decimal64 to float64", - decimal64_array, - DataType::Float64 - ); - benchmark_cast!("cast decimal64 to uint8", decimal64_array, DataType::UInt8); - benchmark_cast!( - "cast decimal64 to uint16", - decimal64_array, - DataType::UInt16 - ); - benchmark_cast!( - "cast decimal64 to uint32", - decimal64_array, - DataType::UInt32 - ); - benchmark_cast!( - "cast decimal64 to uint64", - decimal64_array, - DataType::UInt64 - ); - benchmark_cast!("cast decimal64 to int8", decimal64_array, DataType::Int8); - benchmark_cast!("cast decimal64 to int16", decimal64_array, DataType::Int16); - benchmark_cast!("cast decimal64 to int32", decimal64_array, DataType::Int32); - benchmark_cast!("cast decimal64 to int64", decimal64_array, DataType::Int64); - - benchmark_cast!( - "cast decimal128 to float32", - decimal128_array, - DataType::Float32 - ); benchmark_cast!( "cast decimal128 to float64", decimal128_array, DataType::Float64 ); - benchmark_cast!( - "cast decimal128 to uint8", - decimal128_array, - DataType::UInt8 - ); - benchmark_cast!( - "cast decimal128 to uint16", - decimal128_array, - DataType::UInt16 - ); - benchmark_cast!( - "cast decimal128 to uint32", - decimal128_array, - DataType::UInt32 - ); - benchmark_cast!( - "cast decimal128 to uint64", - decimal128_array, - DataType::UInt64 - ); - benchmark_cast!("cast decimal128 to int8", decimal128_array, DataType::Int8); - benchmark_cast!( - "cast decimal128 to int16", - decimal128_array, - DataType::Int16 - ); - benchmark_cast!( - "cast decimal128 to int32", - decimal128_array, - DataType::Int32 - ); benchmark_cast!( "cast decimal128 to int64", decimal128_array, DataType::Int64 ); - benchmark_cast!( - "cast decimal256 to float32", - decimal256_array, - DataType::Float32 - ); benchmark_cast!( "cast decimal256 to float64", decimal256_array, DataType::Float64 ); - benchmark_cast!( - "cast decimal256 to uint8", - decimal256_array, - DataType::UInt8 - ); - benchmark_cast!( - "cast decimal256 to uint16", - decimal256_array, - DataType::UInt16 - ); - benchmark_cast!( - "cast decimal256 to uint32", - decimal256_array, - DataType::UInt32 - ); - benchmark_cast!( - "cast decimal256 to uint64", - decimal256_array, - DataType::UInt64 - ); - benchmark_cast!("cast decimal256 to int8", decimal256_array, DataType::Int8); - benchmark_cast!( - "cast decimal256 to int16", - decimal256_array, - DataType::Int16 - ); - benchmark_cast!( - "cast decimal256 to int32", - decimal256_array, - DataType::Int32 - ); benchmark_cast!( "cast decimal256 to int64", decimal256_array, From c601b3597364e3df6c2acc3d40f900bd62715b5b Mon Sep 17 00:00:00 2001 From: Andrew Lamb Date: Fri, 24 Apr 2026 19:27:14 -0400 Subject: [PATCH 2/2] Keep decimal128->Int8 case for overflow test --- arrow/benches/cast_kernels.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/arrow/benches/cast_kernels.rs b/arrow/benches/cast_kernels.rs index 07cf02a71a68..82e9696f0458 100644 --- a/arrow/benches/cast_kernels.rs +++ b/arrow/benches/cast_kernels.rs @@ -398,6 +398,7 @@ fn add_benchmark(c: &mut Criterion) { decimal128_array, DataType::Float64 ); + benchmark_cast!("cast decimal128 to int8", decimal128_array, DataType::Int8); benchmark_cast!( "cast decimal128 to int64", decimal128_array,