Skip to content

Commit c042c05

Browse files
committed
tmp: add bench for to_array_size_of
1 parent d359d64 commit c042c05

File tree

3 files changed

+98
-0
lines changed

3 files changed

+98
-0
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

datafusion/common/Cargo.toml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,3 +77,8 @@ web-time = "1.1.0"
7777
chrono = { workspace = true }
7878
insta = { workspace = true }
7979
rand = { workspace = true }
80+
criterion = { workspace = true }
81+
82+
[[bench]]
83+
name = "to_array_size_of"
84+
harness = false
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
use std::sync::Arc;
2+
3+
use arrow::datatypes::{DataType, Field, Int32Type};
4+
use arrow::array::{Array, ArrayRef, BooleanArray, FixedSizeListBuilder, GenericListArray, Int16Array, Int32Array, Int32Builder, Int64Array, LargeListBuilder, ListArray, ListBuilder, MapArray, MapBuilder, StringArray, StringBuilder, StructArray};
5+
6+
use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion};
7+
use datafusion_common::scalar::ScalarStructBuilder;
8+
use datafusion_common::ScalarValue;
9+
10+
pub fn scalar_value_to_size_one_array(c: &mut Criterion) {
11+
12+
let cases: Vec<(&str, ArrayRef)> = vec![
13+
{
14+
// struct array
15+
let fields = vec![Field::new("a", DataType::Int32, false), Field::new("b", DataType::Utf8, false)];
16+
let arrays: Vec<ArrayRef> = vec![
17+
Arc::new(Int32Array::from(vec![1])),
18+
Arc::new(StringArray::from(vec!["foo"])),
19+
];
20+
let nulls = None;
21+
("struct", Arc::new(StructArray::new(fields.into(), arrays, nulls)))
22+
},
23+
// list array
24+
{
25+
let values_builder = StringBuilder::new();
26+
let mut builder = ListBuilder::new(values_builder);
27+
// [A, B]
28+
builder.values().append_value("A");
29+
builder.values().append_value("B");
30+
builder.append(true);
31+
// [ ] (empty list)
32+
builder.append(true);
33+
// Null
34+
builder.values().append_value("?"); // irrelevant
35+
builder.append(false);
36+
("list", Arc::new(builder.finish()))
37+
},
38+
{
39+
// large list array
40+
let values_builder = StringBuilder::new();
41+
let mut builder = LargeListBuilder::new(values_builder);
42+
// [A, B]
43+
builder.values().append_value("A");
44+
builder.values().append_value("B");
45+
builder.append(true);
46+
("large_list", Arc::new(builder.finish()))
47+
},
48+
{
49+
// fixed size list array
50+
let values_builder = Int32Builder::new();
51+
let mut builder = FixedSizeListBuilder::new(values_builder, 3);
52+
53+
builder.values().append_value(0);
54+
builder.values().append_value(1);
55+
builder.values().append_value(2);
56+
builder.append(true);
57+
("fixed_size_list", Arc::new(builder.finish()))
58+
},
59+
{
60+
// map
61+
let string_builder = StringBuilder::new();
62+
let int_builder = Int32Builder::with_capacity(4);
63+
64+
let mut builder = MapBuilder::new(None, string_builder, int_builder);
65+
// {"joe": 1}
66+
builder.keys().append_value("joe");
67+
builder.values().append_value(1);
68+
builder.append(true).unwrap();
69+
("map", Arc::new(builder.finish()))
70+
}];
71+
72+
let mut group = c.benchmark_group("scalar_value_to_array_size_1");
73+
74+
for (name, arr) in cases {
75+
let scalar = ScalarValue::try_from_array(&arr, 0).unwrap();
76+
group.bench_function(BenchmarkId::new(name, "arc_clone"), |b| {
77+
b.iter(|| {
78+
let result = scalar
79+
.to_array_of_size(1)
80+
.expect("Failed to convert to array of size");
81+
assert_eq!(result.len(), 1);
82+
assert_eq!(result.data_type(), arr.data_type());
83+
});
84+
});
85+
}
86+
87+
88+
group.finish();
89+
}
90+
91+
criterion_group!(benches, scalar_value_to_size_one_array);
92+
criterion_main!(benches);

0 commit comments

Comments
 (0)