如何改善Vec初始化时间?

And*_*ner 2 rust

Vec与其他语言相比,在Rust中初始化速度非常慢.例如,以下代码

let xs: Vec<u32> = vec![0u32, 1000000];
Run Code Online (Sandbox Code Playgroud)

将转化为

let xs: Vec<u32> = Vec::new();
xs.push(0);
xs.push(0);
xs.push(0);
// ...
Run Code Online (Sandbox Code Playgroud)

一百万次.如果将其与C中的以下代码进行比较:

uint32_t* xs = calloc(1000000, sizeof(uint32_t));
Run Code Online (Sandbox Code Playgroud)

差异是惊人的.

我有点运气了

let xs: Vec<u32> = Vec::with_capacity(1000000);
xs.resize(1000000, 0);
Run Code Online (Sandbox Code Playgroud)

它仍然很慢.

有没有办法初始化Vec更快?

Ale*_*sen 8

您实际上正在执行不同的操作.在Rust中,您正在分配一百万个零的数组.在C中,您将分配一个包含一百万个零长度元素的数组(即不存在的元素).我不相信这实际上做了什么,因为DK评论了你的问题并指出.

另外,运行你逐字呈现的代码在优化时给了我非常可比的笔记本电脑时间,但这可能是因为Rust中的向量分配正在被优化掉,因为变量从未使用过.

cargo build --release
time ../target/release/test

real   0.024s 
usr    0.004s
sys    0.008s
Run Code Online (Sandbox Code Playgroud)

和C:

gcc -O3 test.c 
time ./a.out

real   0.023s
usr    0.004s
sys    0.004s`
Run Code Online (Sandbox Code Playgroud)

没有--release,Rust性能下降,可能是因为分配实际发生了.请注意,calloc()还要查看内存是否先被清零,如果内存已设置为零,则不会重置内存.这使得执行时间在calloc()某种程度上依赖于您以前的内存状态.