Skip to content

Commit 88d3a7e

Browse files
authored
perf: use size hint when creating Chunk::Collect (#28)
1 parent 9fb3a24 commit 88d3a7e

File tree

3 files changed

+14
-5
lines changed

3 files changed

+14
-5
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
/target
2+
3+
.vscode

benches/operations.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
use criterion::{black_box, criterion_group, criterion_main, Criterion};
22
use tailcall_chunk::Chunk;
33

4+
const N: usize = 10000;
5+
46
fn bench_operations(c: &mut Criterion) {
57
// Benchmark append operations
68
c.benchmark_group("append")
@@ -78,6 +80,13 @@ fn bench_operations(c: &mut Criterion) {
7880
black_box(vec.clone());
7981
})
8082
});
83+
84+
// Benchmark from_iter operation
85+
c.benchmark_group("from_iter")
86+
.bench_function("Chunk", |b| {
87+
b.iter(|| Chunk::from_iter((0..N).into_iter()));
88+
})
89+
.bench_function("Vec", |b| b.iter(|| Vec::from_iter((0..N).into_iter())));
8190
}
8291

8392
criterion_group!(benches, bench_operations);

src/chunk.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -349,11 +349,9 @@ impl<A> FromIterator<A> for Chunk<A> {
349349
/// assert_eq!(chunk.as_vec(), vec![1, 2, 3]);
350350
/// ```
351351
fn from_iter<T: IntoIterator<Item = A>>(iter: T) -> Self {
352-
let mut chunk = Vec::default();
353-
for item in iter {
354-
chunk.push(item);
355-
}
356-
Chunk::Collect(Rc::new(RefCell::new(chunk)))
352+
let vec: Vec<_> = iter.into_iter().collect();
353+
354+
Chunk::Collect(Rc::new(RefCell::new(vec)))
357355
}
358356
}
359357

0 commit comments

Comments
 (0)