Skip to content

Commit 8dbca1e

Browse files
authored
Speed up arithmetic kernels, reduce unsafe usage (#7493)
* Speedup arith * Cleanup * Fmt * Remove more unsafe * Remove more unsafe
1 parent 915e992 commit 8dbca1e

File tree

2 files changed

+15
-25
lines changed

2 files changed

+15
-25
lines changed

arrow-arith/src/arity.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use arrow_array::builder::BufferBuilder;
2121
use arrow_array::*;
2222
use arrow_buffer::buffer::NullBuffer;
2323
use arrow_buffer::ArrowNativeType;
24-
use arrow_buffer::{Buffer, MutableBuffer};
24+
use arrow_buffer::MutableBuffer;
2525
use arrow_data::ArrayData;
2626
use arrow_schema::ArrowError;
2727

@@ -124,13 +124,13 @@ where
124124

125125
let nulls = NullBuffer::union(a.logical_nulls().as_ref(), b.logical_nulls().as_ref());
126126

127-
let values = a.values().iter().zip(b.values()).map(|(l, r)| op(*l, *r));
128-
// JUSTIFICATION
129-
// Benefit
130-
// ~60% speedup
131-
// Soundness
132-
// `values` is an iterator with a known size from a PrimitiveArray
133-
let buffer = unsafe { Buffer::from_trusted_len_iter(values) };
127+
let values = a
128+
.values()
129+
.into_iter()
130+
.zip(b.values())
131+
.map(|(l, r)| op(*l, *r));
132+
133+
let buffer: Vec<_> = values.collect();
134134
Ok(PrimitiveArray::new(buffer.into(), nulls))
135135
}
136136

arrow-array/src/array/primitive_array.rs

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -729,10 +729,8 @@ impl<T: ArrowPrimitiveType> PrimitiveArray<T> {
729729

730730
/// Creates a PrimitiveArray based on a constant value with `count` elements
731731
pub fn from_value(value: T::Native, count: usize) -> Self {
732-
unsafe {
733-
let val_buf = Buffer::from_trusted_len_iter((0..count).map(|_| value));
734-
Self::new(val_buf.into(), None)
735-
}
732+
let val_buf: Vec<_> = vec![value; count];
733+
Self::new(val_buf.into(), None)
736734
}
737735

738736
/// Returns an iterator that returns the values of `array.value(i)` for an iterator with each element `i`
@@ -827,13 +825,8 @@ impl<T: ArrowPrimitiveType> PrimitiveArray<T> {
827825
F: Fn(T::Native) -> O::Native,
828826
{
829827
let nulls = self.nulls().cloned();
830-
let values = self.values().iter().map(|v| op(*v));
831-
// JUSTIFICATION
832-
// Benefit
833-
// ~60% speedup
834-
// Soundness
835-
// `values` is an iterator with a known size because arrays are sized.
836-
let buffer = unsafe { Buffer::from_trusted_len_iter(values) };
828+
let values = self.values().into_iter().map(|v| op(*v));
829+
let buffer: Vec<_> = values.collect();
837830
PrimitiveArray::new(buffer.into(), nulls)
838831
}
839832

@@ -1035,13 +1028,10 @@ impl<T: ArrowPrimitiveType> PrimitiveArray<T> {
10351028
F: FnMut(U::Item) -> T::Native,
10361029
{
10371030
let nulls = left.logical_nulls();
1038-
let buffer = unsafe {
1031+
let buffer: Vec<_> = (0..left.len())
10391032
// SAFETY: i in range 0..left.len()
1040-
let iter = (0..left.len()).map(|i| op(left.value_unchecked(i)));
1041-
// SAFETY: upper bound is trusted because `iter` is over a range
1042-
Buffer::from_trusted_len_iter(iter)
1043-
};
1044-
1033+
.map(|i| op(unsafe { left.value_unchecked(i) }))
1034+
.collect();
10451035
PrimitiveArray::new(buffer.into(), nulls)
10461036
}
10471037

0 commit comments

Comments
 (0)