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

标签 rust

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

相关文章:

rust - 为什么我使用 config-rs 时收到 "missing field"错误?

rust - 将 libc::getcwd 的输出转换为字符串

rust - 在 vec 排水管上捕捉 panic

rust - 尝试从向量返回值时出现错误 "the trait Sized is not implemented"

rust - 如何处理 flat_map 中的结果

rust - 可以使用关联常量来初始化固定大小数组的长度吗?

rust - 如何将网站内容下载到字符串中?

rust - 用 0 向左填充字符串的最简单方法是什么?

rust - 如何使用 NetRc 解决不明确的关联类型

rust - 是否可以在 &mut 周围创建一个包装器,其作用类似于 &mut