Если вы когда-либо сомневаетесь в производительности в Rust, не забудьте о тестах .
#![feature(test)]
extern crate test;
#[cfg(test)]
mod tests {
use test::Bencher;
const CURRENT_ID: u64 = 1;
const LATEST_ID: u64 = 60000;
#[bench]
fn push(b: &mut Bencher) {
b.iter(|| {
let mut ids: Vec<u64> = vec![];
let mut start = CURRENT_ID;
while !(start >= LATEST_ID) {
start += 1;
ids.push(start);
}
});
}
#[bench]
fn collect(b: &mut Bencher) {
b.iter(|| {
let _ids: Vec<u64> = (CURRENT_ID + 1..LATEST_ID).collect();
});
}
}
Бег cargo bench
,
running 2 tests
test tests::collect ... bench: 29,931 ns/iter (+/- 6,842)
test tests::push ... bench: 85,701 ns/iter (+/- 18,096)
Вы можете видеть, что collect
на самом деле быстрее, чем push
(намного).Я предполагаю, что это связано с push
, иногда с необходимостью клонировать целое Vec
и переместить его в другое место в памяти (хотя не цитируйте меня об этом).