gpt4 book ai didi

rust - 通过循环和 push() 或通过 collect() 创建一个充满顺序 u64 的大型 Vec 是否更快?

转载 作者:行者123 更新时间:2023-11-29 08:08:26 26 4
gpt4 key购买 nike

我正在寻找执行此操作的最有效方法,因为我必须创建一个包含大约 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com