@@ -5,26 +5,50 @@ use arrow2_convert::{
55} ;
66use criterion:: { black_box, criterion_group, criterion_main, BenchmarkId , Criterion , Throughput } ;
77
8+ // Arrow stores U8 arrays as `arrow2::array::BinaryArray`
89#[ derive( ArrowField , ArrowSerialize , ArrowDeserialize ) ]
910#[ arrow_field( transparent) ]
10- pub struct BufStruct ( Buffer < u16 > ) ;
11+ pub struct BufU8Struct ( Buffer < u8 > ) ;
1112
13+ // Arrow stores other arrows as `arrow2::array::ListArray`
1214#[ derive( ArrowField , ArrowSerialize , ArrowDeserialize ) ]
1315#[ arrow_field( transparent) ]
14- pub struct VecStruct ( Vec < u16 > ) ;
16+ pub struct BufU32Struct ( Buffer < u32 > ) ;
17+
18+ // Arrow stores U8 arrows as `arrow2::array::BinaryArray`
19+ #[ derive( ArrowField , ArrowSerialize , ArrowDeserialize ) ]
20+ #[ arrow_field( transparent) ]
21+ pub struct VecU8Struct ( Vec < u8 > ) ;
22+
23+ // Arrow stores other arrows as `arrow2::array::ListArray`
24+ #[ derive( ArrowField , ArrowSerialize , ArrowDeserialize ) ]
25+ #[ arrow_field( transparent) ]
26+ pub struct VecU32Struct ( Vec < u32 > ) ;
1527
1628pub fn bench_buffer_serialize ( c : & mut Criterion ) {
1729 let mut group = c. benchmark_group ( "serialize" ) ;
1830 for size in [ 1 , 10 , 100 , 1000 , 10000 ] . iter ( ) {
1931 group. throughput ( Throughput :: Elements ( * size as u64 ) ) ;
20- group. bench_with_input ( BenchmarkId :: new ( "Buffer " , size) , size, |b, & size| {
21- let data = [ BufStruct ( ( 0 ..size as u16 ) . into_iter ( ) . collect ( ) ) ] ;
32+ group. bench_with_input ( BenchmarkId :: new ( "BufferU8 " , size) , size, |b, & size| {
33+ let data = [ BufU8Struct ( ( 0 ..size as u8 ) . into_iter ( ) . collect ( ) ) ] ;
2234 b. iter ( || {
2335 let _: Box < dyn Array > = TryIntoArrow :: try_into_arrow ( black_box ( & data) ) . unwrap ( ) ;
2436 } ) ;
2537 } ) ;
26- group. bench_with_input ( BenchmarkId :: new ( "Vec" , size) , size, |b, & size| {
27- let data = [ VecStruct ( ( 0 ..size as u16 ) . into_iter ( ) . collect ( ) ) ] ;
38+ group. bench_with_input ( BenchmarkId :: new ( "VecU8" , size) , size, |b, & size| {
39+ let data = [ VecU8Struct ( ( 0 ..size as u8 ) . into_iter ( ) . collect ( ) ) ] ;
40+ b. iter ( || {
41+ let _: Box < dyn Array > = TryIntoArrow :: try_into_arrow ( black_box ( & data) ) . unwrap ( ) ;
42+ } ) ;
43+ } ) ;
44+ group. bench_with_input ( BenchmarkId :: new ( "BufferU32" , size) , size, |b, & size| {
45+ let data = [ BufU32Struct ( ( 0 ..size as u32 ) . into_iter ( ) . collect ( ) ) ] ;
46+ b. iter ( || {
47+ let _: Box < dyn Array > = TryIntoArrow :: try_into_arrow ( black_box ( & data) ) . unwrap ( ) ;
48+ } ) ;
49+ } ) ;
50+ group. bench_with_input ( BenchmarkId :: new ( "VecU32" , size) , size, |b, & size| {
51+ let data = [ VecU32Struct ( ( 0 ..size as u32 ) . into_iter ( ) . collect ( ) ) ] ;
2852 b. iter ( || {
2953 let _: Box < dyn Array > = TryIntoArrow :: try_into_arrow ( black_box ( & data) ) . unwrap ( ) ;
3054 } ) ;
@@ -35,27 +59,53 @@ pub fn bench_buffer_deserialize(c: &mut Criterion) {
3559 let mut group = c. benchmark_group ( "deserialize" ) ;
3660 for size in [ 1 , 10 , 100 , 1000 , 10000 ] . iter ( ) {
3761 group. throughput ( Throughput :: Elements ( * size as u64 ) ) ;
38- group. bench_with_input ( BenchmarkId :: new ( "Buffer" , size) , size, |b, & size| {
39- let data: Box < dyn Array > = [ BufStruct ( ( 0 ..size as u16 ) . into_iter ( ) . collect ( ) ) ]
62+ group. bench_with_input ( BenchmarkId :: new ( "BufferU8" , size) , size, |b, & size| {
63+ let data: Box < dyn Array > = [ BufU8Struct ( ( 0 ..size as u8 ) . into_iter ( ) . collect ( ) ) ]
64+ . try_into_arrow ( )
65+ . unwrap ( ) ;
66+ b. iter_batched (
67+ || data. clone ( ) ,
68+ |data| {
69+ let _: Vec < BufU8Struct > =
70+ TryIntoCollection :: try_into_collection ( black_box ( data) ) . unwrap ( ) ;
71+ } ,
72+ criterion:: BatchSize :: SmallInput ,
73+ )
74+ } ) ;
75+ group. bench_with_input ( BenchmarkId :: new ( "VecU8" , size) , size, |b, & size| {
76+ let data: Box < dyn Array > = [ VecU8Struct ( ( 0 ..size as u8 ) . into_iter ( ) . collect ( ) ) ]
77+ . try_into_arrow ( )
78+ . unwrap ( ) ;
79+ b. iter_batched (
80+ || data. clone ( ) ,
81+ |data| {
82+ let _: Vec < VecU8Struct > =
83+ TryIntoCollection :: try_into_collection ( black_box ( data) ) . unwrap ( ) ;
84+ } ,
85+ criterion:: BatchSize :: SmallInput ,
86+ ) ;
87+ } ) ;
88+ group. bench_with_input ( BenchmarkId :: new ( "BufferU32" , size) , size, |b, & size| {
89+ let data: Box < dyn Array > = [ BufU32Struct ( ( 0 ..size as u32 ) . into_iter ( ) . collect ( ) ) ]
4090 . try_into_arrow ( )
4191 . unwrap ( ) ;
4292 b. iter_batched (
4393 || data. clone ( ) ,
4494 |data| {
45- let _: Vec < BufStruct > =
95+ let _: Vec < BufU32Struct > =
4696 TryIntoCollection :: try_into_collection ( black_box ( data) ) . unwrap ( ) ;
4797 } ,
4898 criterion:: BatchSize :: SmallInput ,
4999 )
50100 } ) ;
51- group. bench_with_input ( BenchmarkId :: new ( "Vec " , size) , size, |b, & size| {
52- let data: Box < dyn Array > = [ VecStruct ( ( 0 ..size as u16 ) . into_iter ( ) . collect ( ) ) ]
101+ group. bench_with_input ( BenchmarkId :: new ( "VecU32 " , size) , size, |b, & size| {
102+ let data: Box < dyn Array > = [ VecU32Struct ( ( 0 ..size as u32 ) . into_iter ( ) . collect ( ) ) ]
53103 . try_into_arrow ( )
54104 . unwrap ( ) ;
55105 b. iter_batched (
56106 || data. clone ( ) ,
57107 |data| {
58- let _: Vec < VecStruct > =
108+ let _: Vec < VecU32Struct > =
59109 TryIntoCollection :: try_into_collection ( black_box ( data) ) . unwrap ( ) ;
60110 } ,
61111 criterion:: BatchSize :: SmallInput ,
0 commit comments