Skip to content

Commit 6838253

Browse files
authored
performance[vortex-array]: avoid is_valid call in varbinview builder (#6033)
Similar to #5814, this creates a lot of unnecessary CPU usage: <img width="924" height="423" alt="image" src="https://github.com/user-attachments/assets/5255cc92-3068-49f1-a636-0dd0c3d14171" /> Signed-off-by: Alfonso Subiotto Marques <alfonso.subiotto@polarsignals.com>
1 parent b4204cb commit 6838253

File tree

1 file changed

+37
-15
lines changed

1 file changed

+37
-15
lines changed

vortex-array/src/builders/varbinview.rs

Lines changed: 37 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -294,22 +294,44 @@ impl ArrayBuilder for VarBinViewBuilder {
294294
.iter()
295295
.map(|view| adjustment.adjust_view(view)),
296296
),
297-
ViewAdjustment::Rewriting(adjustment) => {
298-
for (idx, &view) in array.views().iter().enumerate() {
299-
let new_view = if !array.is_valid(idx) {
300-
BinaryView::empty_view()
301-
} else if view.is_inlined() {
302-
view
303-
} else if let Some(adjusted) = adjustment.adjust_view(&view) {
304-
adjusted
305-
} else {
306-
let bytes = array.bytes_at(idx);
307-
let (new_buf_idx, new_offset) = self.append_value_to_buffer(&bytes);
308-
BinaryView::make_view(bytes.as_slice(), new_buf_idx, new_offset)
309-
};
310-
self.views_builder.push(new_view)
297+
ViewAdjustment::Rewriting(adjustment) => match array.validity_mask() {
298+
Mask::AllTrue(_) => {
299+
for (idx, &view) in array.views().iter().enumerate() {
300+
let new_view = if view.is_inlined() {
301+
view
302+
} else if let Some(adjusted) = adjustment.adjust_view(&view) {
303+
adjusted
304+
} else {
305+
let bytes = array.bytes_at(idx);
306+
let (new_buf_idx, new_offset) = self.append_value_to_buffer(&bytes);
307+
BinaryView::make_view(bytes.as_slice(), new_buf_idx, new_offset)
308+
};
309+
self.views_builder.push(new_view);
310+
}
311311
}
312-
}
312+
Mask::AllFalse(_) => {
313+
self.views_builder
314+
.push_n(BinaryView::empty_view(), array.len());
315+
}
316+
Mask::Values(v) => {
317+
for (idx, (&view, is_valid)) in
318+
array.views().iter().zip(v.bit_buffer().iter()).enumerate()
319+
{
320+
let new_view = if !is_valid {
321+
BinaryView::empty_view()
322+
} else if view.is_inlined() {
323+
view
324+
} else if let Some(adjusted) = adjustment.adjust_view(&view) {
325+
adjusted
326+
} else {
327+
let bytes = array.bytes_at(idx);
328+
let (new_buf_idx, new_offset) = self.append_value_to_buffer(&bytes);
329+
BinaryView::make_view(bytes.as_slice(), new_buf_idx, new_offset)
330+
};
331+
self.views_builder.push(new_view);
332+
}
333+
}
334+
},
313335
}
314336
}
315337

0 commit comments

Comments
 (0)