@@ -12,6 +12,7 @@ use vortex_array::RecursiveCanonical;
1212use vortex_array:: VortexSessionExecute ;
1313use vortex_array:: arrays:: ConstantArray ;
1414use vortex_array:: arrays:: VarBinArray ;
15+ use vortex_array:: arrays:: VarBinViewArray ;
1516use vortex_array:: builtins:: ArrayBuiltins ;
1617use vortex_array:: expr:: like;
1718use vortex_array:: expr:: lit;
@@ -38,6 +39,16 @@ const NUM_URLS: usize = NUM_STRINGS;
3839
3940static URL_DATA : LazyLock < VarBinArray > = LazyLock :: new ( generate_url_data) ;
4041
42+ /// `URL_DATA` as a `VarBinViewArray`, used by the view-input bench variants.
43+ static URL_VIEW_DATA : LazyLock < VarBinViewArray > = LazyLock :: new ( || {
44+ let mut ctx = SESSION . create_execution_ctx ( ) ;
45+ URL_DATA
46+ . clone ( )
47+ . into_array ( )
48+ . execute :: < VarBinViewArray > ( & mut ctx)
49+ . unwrap ( )
50+ } ) ;
51+
4152// ---------------------------------------------------------------------------
4253// Eq compare benchmarks (FSST pushdown vs canonicalize)
4354// ---------------------------------------------------------------------------
@@ -56,14 +67,10 @@ fn pick_url_with_domain(data: &VarBinArray, domain: &str) -> String {
5667#[ divan:: bench]
5768fn eq_pushdown_high_match ( bencher : Bencher ) {
5869 let data = & * URL_DATA ;
59- let compressor = fsst_train_compressor ( data) ;
60- let fsst_array = fsst_compress (
61- data,
62- data. len ( ) ,
63- data. dtype ( ) ,
64- & compressor,
65- & mut SESSION . create_execution_ctx ( ) ,
66- ) ;
70+ let mut ctx = SESSION . create_execution_ctx ( ) ;
71+ let array = data. clone ( ) . into_array ( ) ;
72+ let compressor = fsst_train_compressor ( array. clone ( ) , & mut ctx) . unwrap ( ) ;
73+ let fsst_array = fsst_compress ( array, & compressor, & mut ctx) . unwrap ( ) ;
6774 let match_url = pick_url_with_domain ( data, HIGH_MATCH_DOMAIN ) ;
6875 let constant = ConstantArray :: new ( Scalar :: from ( match_url. as_str ( ) ) , NUM_URLS ) ;
6976
@@ -83,14 +90,10 @@ fn eq_pushdown_high_match(bencher: Bencher) {
8390#[ divan:: bench]
8491fn eq_pushdown_low_match ( bencher : Bencher ) {
8592 let data = & * URL_DATA ;
86- let compressor = fsst_train_compressor ( data) ;
87- let fsst_array = fsst_compress (
88- data,
89- data. len ( ) ,
90- data. dtype ( ) ,
91- & compressor,
92- & mut SESSION . create_execution_ctx ( ) ,
93- ) ;
93+ let mut ctx = SESSION . create_execution_ctx ( ) ;
94+ let array = data. clone ( ) . into_array ( ) ;
95+ let compressor = fsst_train_compressor ( array. clone ( ) , & mut ctx) . unwrap ( ) ;
96+ let fsst_array = fsst_compress ( array, & compressor, & mut ctx) . unwrap ( ) ;
9497 let match_url = pick_url_with_domain ( data, LOW_MATCH_DOMAIN ) ;
9598 let constant = ConstantArray :: new ( Scalar :: from ( match_url. as_str ( ) ) , NUM_URLS ) ;
9699
@@ -107,17 +110,59 @@ fn eq_pushdown_low_match(bencher: Bencher) {
107110 } ) ;
108111}
109112
113+ #[ divan:: bench]
114+ fn eq_pushdown_high_match_view ( bencher : Bencher ) {
115+ let data = & * URL_VIEW_DATA ;
116+ let mut ctx = SESSION . create_execution_ctx ( ) ;
117+ let array = data. clone ( ) . into_array ( ) ;
118+ let compressor = fsst_train_compressor ( array. clone ( ) , & mut ctx) . unwrap ( ) ;
119+ let fsst_array = fsst_compress ( array, & compressor, & mut ctx) . unwrap ( ) ;
120+ let match_url = pick_url_with_domain ( & URL_DATA , HIGH_MATCH_DOMAIN ) ;
121+ let constant = ConstantArray :: new ( Scalar :: from ( match_url. as_str ( ) ) , NUM_URLS ) ;
122+
123+ bencher
124+ . with_inputs ( || ( & fsst_array, & constant, SESSION . create_execution_ctx ( ) ) )
125+ . bench_refs ( |( fsst_array, constant, ctx) | {
126+ fsst_array
127+ . clone ( )
128+ . into_array ( )
129+ . binary ( constant. clone ( ) . into_array ( ) , Operator :: Eq )
130+ . unwrap ( )
131+ . execute :: < RecursiveCanonical > ( ctx)
132+ . unwrap ( )
133+ } ) ;
134+ }
135+
136+ #[ divan:: bench]
137+ fn eq_pushdown_low_match_view ( bencher : Bencher ) {
138+ let data = & * URL_VIEW_DATA ;
139+ let mut ctx = SESSION . create_execution_ctx ( ) ;
140+ let array = data. clone ( ) . into_array ( ) ;
141+ let compressor = fsst_train_compressor ( array. clone ( ) , & mut ctx) . unwrap ( ) ;
142+ let fsst_array = fsst_compress ( array, & compressor, & mut ctx) . unwrap ( ) ;
143+ let match_url = pick_url_with_domain ( & URL_DATA , LOW_MATCH_DOMAIN ) ;
144+ let constant = ConstantArray :: new ( Scalar :: from ( match_url. as_str ( ) ) , NUM_URLS ) ;
145+
146+ bencher
147+ . with_inputs ( || ( & fsst_array, & constant, SESSION . create_execution_ctx ( ) ) )
148+ . bench_refs ( |( fsst_array, constant, ctx) | {
149+ fsst_array
150+ . clone ( )
151+ . into_array ( )
152+ . binary ( constant. clone ( ) . into_array ( ) , Operator :: Eq )
153+ . unwrap ( )
154+ . execute :: < RecursiveCanonical > ( ctx)
155+ . unwrap ( )
156+ } ) ;
157+ }
158+
110159#[ divan:: bench]
111160fn eq_canonicalize_high_match ( bencher : Bencher ) {
112161 let data = & * URL_DATA ;
113- let compressor = fsst_train_compressor ( data) ;
114- let fsst_array = fsst_compress (
115- data,
116- data. len ( ) ,
117- data. dtype ( ) ,
118- & compressor,
119- & mut SESSION . create_execution_ctx ( ) ,
120- ) ;
162+ let mut ctx = SESSION . create_execution_ctx ( ) ;
163+ let array = data. clone ( ) . into_array ( ) ;
164+ let compressor = fsst_train_compressor ( array. clone ( ) , & mut ctx) . unwrap ( ) ;
165+ let fsst_array = fsst_compress ( array, & compressor, & mut ctx) . unwrap ( ) ;
121166 let match_url = pick_url_with_domain ( data, HIGH_MATCH_DOMAIN ) ;
122167 let constant = ConstantArray :: new ( Scalar :: from ( match_url. as_str ( ) ) , NUM_URLS ) ;
123168
@@ -140,14 +185,10 @@ fn eq_canonicalize_high_match(bencher: Bencher) {
140185#[ divan:: bench]
141186fn eq_canonicalize_low_match ( bencher : Bencher ) {
142187 let data = & * URL_DATA ;
143- let compressor = fsst_train_compressor ( data) ;
144- let fsst_array = fsst_compress (
145- data,
146- data. len ( ) ,
147- data. dtype ( ) ,
148- & compressor,
149- & mut SESSION . create_execution_ctx ( ) ,
150- ) ;
188+ let mut ctx = SESSION . create_execution_ctx ( ) ;
189+ let array = data. clone ( ) . into_array ( ) ;
190+ let compressor = fsst_train_compressor ( array. clone ( ) , & mut ctx) . unwrap ( ) ;
191+ let fsst_array = fsst_compress ( array, & compressor, & mut ctx) . unwrap ( ) ;
151192 let match_url = pick_url_with_domain ( data, LOW_MATCH_DOMAIN ) ;
152193 let constant = ConstantArray :: new ( Scalar :: from ( match_url. as_str ( ) ) , NUM_URLS ) ;
153194
@@ -174,14 +215,10 @@ fn eq_canonicalize_low_match(bencher: Bencher) {
174215#[ divan:: bench]
175216fn like_substr_high_match ( bencher : Bencher ) {
176217 let data = & * URL_DATA ;
177- let compressor = fsst_train_compressor ( data) ;
178- let fsst_array = fsst_compress (
179- data,
180- data. len ( ) ,
181- data. dtype ( ) ,
182- & compressor,
183- & mut SESSION . create_execution_ctx ( ) ,
184- ) ;
218+ let mut ctx = SESSION . create_execution_ctx ( ) ;
219+ let array = data. clone ( ) . into_array ( ) ;
220+ let compressor = fsst_train_compressor ( array. clone ( ) , & mut ctx) . unwrap ( ) ;
221+ let fsst_array = fsst_compress ( array, & compressor, & mut ctx) . unwrap ( ) ;
185222 let pattern = format ! ( "%{HIGH_MATCH_DOMAIN}%" ) ;
186223 let expr = like ( root ( ) , lit ( pattern. as_str ( ) ) ) ;
187224
@@ -201,14 +238,10 @@ fn like_substr_high_match(bencher: Bencher) {
201238#[ divan:: bench]
202239fn like_substr_low_match ( bencher : Bencher ) {
203240 let data = & * URL_DATA ;
204- let compressor = fsst_train_compressor ( data) ;
205- let fsst_array = fsst_compress (
206- data,
207- data. len ( ) ,
208- data. dtype ( ) ,
209- & compressor,
210- & mut SESSION . create_execution_ctx ( ) ,
211- ) ;
241+ let mut ctx = SESSION . create_execution_ctx ( ) ;
242+ let array = data. clone ( ) . into_array ( ) ;
243+ let compressor = fsst_train_compressor ( array. clone ( ) , & mut ctx) . unwrap ( ) ;
244+ let fsst_array = fsst_compress ( array, & compressor, & mut ctx) . unwrap ( ) ;
212245 let pattern = format ! ( "%{LOW_MATCH_DOMAIN}%" ) ;
213246 let expr = like ( root ( ) , lit ( pattern. as_str ( ) ) ) ;
214247
0 commit comments