Skip to content

Commit fb8626a

Browse files
committed
Hide type information from from_iter
1 parent 149800d commit fb8626a

File tree

2 files changed

+33
-24
lines changed

2 files changed

+33
-24
lines changed

arrow-array/src/array/boolean_array.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -480,11 +480,14 @@ impl From<&Option<bool>> for BooleanAdapter {
480480

481481
impl<Ptr: Into<BooleanAdapter>> FromIterator<Ptr> for BooleanArray {
482482
fn from_iter<I: IntoIterator<Item = Ptr>>(iter: I) -> Self {
483-
let vec = iter.into_iter().collect::<Vec<_>>();
484-
unsafe {
485-
// SAFETY: Vec iterator is trusted len
486-
BooleanArray::from_trusted_len_iter(vec)
487-
}
483+
let iter = iter.into_iter();
484+
let capacity = match iter.size_hint() {
485+
(lower, Some(upper)) if lower == upper => lower,
486+
_ => 0,
487+
};
488+
let mut builder = BooleanBuilder::with_capacity(capacity);
489+
builder.extend(iter.map(|item| item.into().native));
490+
builder.finish()
488491
}
489492
}
490493

arrow/benches/array_from.rs

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,12 @@
1515
// specific language governing permissions and limitations
1616
// under the License.
1717

18+
extern crate arrow;
1819
#[macro_use]
1920
extern crate criterion;
2021

2122
use criterion::Criterion;
2223

23-
extern crate arrow;
24-
2524
use arrow::array::*;
2625
use arrow_buffer::i256;
2726
use rand::Rng;
@@ -207,40 +206,47 @@ fn array_from_vec_benchmark(c: &mut Criterion) {
207206
});
208207
}
209208

210-
fn gen_option_vector<TItem: Copy>(item: TItem, len: usize) -> Vec<Option<TItem>> {
211-
hint::black_box(
212-
repeat_n(item, len)
213-
.enumerate()
214-
.map(|(idx, item)| if idx % 3 == 0 { None } else { Some(item) })
215-
.collect(),
216-
)
209+
fn gen_option_iter<TItem: Clone + 'static>(
210+
item: TItem,
211+
len: usize,
212+
) -> Box<dyn Iterator<Item = Option<TItem>>> {
213+
hint::black_box(Box::new(repeat_n(item, len).enumerate().map(
214+
|(idx, item)| {
215+
if idx % 3 == 0 {
216+
None
217+
} else {
218+
Some(item)
219+
}
220+
},
221+
)))
217222
}
218223

219224
fn from_iter_benchmark(c: &mut Criterion) {
220225
const ITER_LEN: usize = 16_384;
221226

222227
// All ArrowPrimitiveType use the same implementation
223228
c.bench_function("Int64Array::from_iter", |b| {
224-
let values = gen_option_vector(1, ITER_LEN);
225-
b.iter(|| hint::black_box(Int64Array::from_iter(values.iter())));
229+
b.iter(|| hint::black_box(Int64Array::from_iter(gen_option_iter(1, ITER_LEN))));
226230
});
227231
c.bench_function("Int64Array::from_trusted_len_iter", |b| {
228-
let values = gen_option_vector(1, ITER_LEN);
232+
let values = gen_option_iter(1, ITER_LEN);
229233
b.iter(|| unsafe {
230-
// SAFETY: values.iter() is a TrustedLenIterator
231-
hint::black_box(Int64Array::from_trusted_len_iter(values.iter()))
234+
// SAFETY: gen_option_iter is a TrustedLenIterator
235+
hint::black_box(Int64Array::from_trusted_len_iter(gen_option_iter(
236+
1, ITER_LEN,
237+
)))
232238
});
233239
});
234240

235241
c.bench_function("BooleanArray::from_iter", |b| {
236-
let values = gen_option_vector(true, ITER_LEN);
237-
b.iter(|| hint::black_box(BooleanArray::from_iter(values.iter())));
242+
b.iter(|| hint::black_box(BooleanArray::from_iter(gen_option_iter(true, ITER_LEN))));
238243
});
239244
c.bench_function("BooleanArray::from_trusted_len_iter", |b| {
240-
let values = gen_option_vector(true, ITER_LEN);
241245
b.iter(|| unsafe {
242-
// SAFETY: values.iter() is a TrustedLenIterator
243-
hint::black_box(BooleanArray::from_trusted_len_iter(values.iter()))
246+
// SAFETY: gen_option_iter is a TrustedLenIterator
247+
hint::black_box(BooleanArray::from_trusted_len_iter(gen_option_iter(
248+
true, ITER_LEN,
249+
)))
244250
});
245251
});
246252
}

0 commit comments

Comments
 (0)