我正在寻找执行此操作的最有效方法,因为我必须创建一个包含大约 600,000 个 u64
整数的向量。
这是我的第一次尝试:
fn latest_ids(current_id: u64, latest_id: u64) -> Vec<u64> {
let mut ids: Vec<u64> = vec![];
let mut start = current_id;
while !(start >= latest_id) {
start += 1;
ids.push(start);
}
ids
}
第二次尝试:
fn latest_ids(current_id: u64, latest_id: u64) -> Vec<u64> {
let ids: Vec<u64> = (current_id+1..latest_id).collect();
ids
}
第二个版本更短/更清晰,但我不确定 collect()
的效率如何?或者有更好的方法吗?
最佳答案
如果您对 Rust 的性能有疑问,请不要忘记 benchmarks .
#![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
并将其移动到内存中的不同位置有关(虽然不要引用我的话) .
关于rust - 通过循环和 push() 或通过 collect() 创建一个充满顺序 u64 的大型 Vec 是否更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55979703/