@@ -15,11 +15,17 @@ use divan::Bencher;
1515use divan:: counter:: ItemsCount ;
1616use mimalloc:: MiMalloc ;
1717use vortex_array:: ArrayRef ;
18+ use vortex_array:: EmptyMetadata ;
1819use vortex_array:: IntoArray ;
1920use vortex_array:: VortexSessionExecute ;
21+ use vortex_array:: arrays:: ConstantArray ;
2022use vortex_array:: arrays:: FixedSizeListArray ;
2123use vortex_array:: arrays:: MaskedArray ;
2224use vortex_array:: arrays:: PrimitiveArray ;
25+ use vortex_array:: dtype:: DType ;
26+ use vortex_array:: dtype:: Nullability ;
27+ use vortex_array:: dtype:: PType ;
28+ use vortex_array:: scalar:: Scalar ;
2329use vortex_array:: validity:: Validity ;
2430use vortex_buffer:: Buffer ;
2531use vortex_tensor:: scalar_fns:: inner_product:: InnerProduct ;
@@ -56,6 +62,16 @@ fn vectors(width: usize, seed: usize) -> ArrayRef {
5662 Vector :: try_new_vector_array ( storage) . unwrap ( )
5763}
5864
65+ fn constant_vector ( width : usize ) -> ArrayRef {
66+ let element_dtype = DType :: Primitive ( PType :: F64 , Nullability :: NonNullable ) ;
67+ let children = ( 0 ..width)
68+ . map ( |i| Scalar :: primitive ( ( ( i % 97 ) as f64 ) - 48.0 , Nullability :: NonNullable ) )
69+ . collect ( ) ;
70+ let storage = Scalar :: fixed_size_list ( element_dtype, children, Nullability :: NonNullable ) ;
71+ let vector = Scalar :: extension :: < Vector > ( EmptyMetadata , storage) ;
72+ ConstantArray :: new ( vector, ELEMENTS / width) . into_array ( )
73+ }
74+
5975fn bench_inner_product ( bencher : Bencher , lhs : ArrayRef , rhs : ArrayRef ) {
6076 let session = vortex_array:: array_session ( ) ;
6177 bencher
@@ -84,3 +100,22 @@ fn nullable(bencher: Bencher, width: usize) {
84100 . into_array ( ) ;
85101 bench_inner_product ( bencher, lhs, vectors ( width, 31 ) ) ;
86102}
103+
104+ #[ divan:: bench( args = WIDTHS ) ]
105+ fn column_x_constant ( bencher : Bencher , width : usize ) {
106+ bench_inner_product ( bencher, vectors ( width, 0 ) , constant_vector ( width) ) ;
107+ }
108+
109+ #[ divan:: bench( args = WIDTHS ) ]
110+ fn constant_x_column ( bencher : Bencher , width : usize ) {
111+ bench_inner_product ( bencher, constant_vector ( width) , vectors ( width, 31 ) ) ;
112+ }
113+
114+ #[ divan:: bench( args = WIDTHS ) ]
115+ fn column_x_nullable_constant ( bencher : Bencher , width : usize ) {
116+ let validity = Validity :: from_iter ( ( 0 ..ELEMENTS / width) . map ( |i| i % 8 != 0 ) ) ;
117+ let rhs = MaskedArray :: try_new ( constant_vector ( width) , validity)
118+ . unwrap ( )
119+ . into_array ( ) ;
120+ bench_inner_product ( bencher, vectors ( width, 0 ) , rhs) ;
121+ }
0 commit comments