与其他语言相比,在Rust中初始化Vec
的速度非常慢。例如,以下代码
let xs: Vec<u32> = vec![0u32, 1000000];
将转换为
let xs: Vec<u32> = Vec::new();
xs.push(0);
xs.push(0);
xs.push(0);
// ...
一百万次。如果将其与C中的以下代码进行比较:
uint32_t* xs = calloc(1000000, sizeof(uint32_t));
差别很大。
我有点运气了
let xs: Vec<u32> = Vec::with_capacity(1000000);
xs.resize(1000000, 0);
它仍然很慢。
有没有办法快速初始化Vec
?
答案 0 :(得分:7)
您实际上在执行不同的操作。在Rust中,您正在分配一百万个零的数组。在C中,您将分配一个包含一百万个零长度元素的数组(即不存在的元素)。我不相信这实际上做了什么,因为DK评论了你的问题并指出。
此外,运行您逐字呈现的代码在优化时在笔记本电脑上给出了非常可比的时间,但这可能是因为Rust中的向量分配正在被优化掉,因为变量从未使用过。
cargo build --release
time ../target/release/test
real 0.024s
usr 0.004s
sys 0.008s
和C:
gcc -O3 test.c
time ./a.out
real 0.023s
usr 0.004s
sys 0.004s`
没有--release,Rust性能下降,可能是因为分配实际发生了。请注意,calloc()
还会查看内存是否先被清零,如果内存已设置为零,则不会重置内存。这使得calloc()
的执行时间在某种程度上依赖于您以前的记忆状态。