Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 如何提高Vec初始化时间?_Rust - Fatal编程技术网

Rust 如何提高Vec初始化时间?

Rust 如何提高Vec初始化时间?,rust,Rust,与其他语言相比,在Rust中初始化Vec的速度非常慢。例如,下面的代码 let xs: Vec<u32> = vec![0u32, 1000000]; 差别是惊人的 我的运气好一点 let xs: Vec<u32> = Vec::with_capacity(1000000); xs.resize(1000000, 0); 让xs:Vec=Vec::具有_容量(1000000); 调整大小(1000000,0); 但是还是很慢 有什么方法可以更快地初始化Vec吗?您实

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

let xs: Vec<u32> = vec![0u32, 1000000];
差别是惊人的

我的运气好一点

let xs: Vec<u32> = Vec::with_capacity(1000000);
xs.resize(1000000, 0);
让xs:Vec=Vec::具有_容量(1000000);
调整大小(1000000,0);
但是还是很慢


有什么方法可以更快地初始化Vec吗?

您实际上正在执行不同的操作。在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`

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

您是如何编译Rust程序的?您是否通过了
--release
标志?(这将启用优化)如果我错了,请纠正我,但这不是
calloc
调用分配了一百万个零大小元素的数组吗?手册页上说这样做不会分配任何东西,所以当然区别会非常明显……检查您的源代码,
vec![0U321000000]
没有编译成一百万次对
推送的调用。它基本上编译成
Vec::with_capacity
+
Vec::resize
@DK.,没错,我更新了这个问题。你需要显示你正在测试的实际代码和你正在使用的编译器开关,因为当我复制并粘贴给定的代码时(修复C代码,使
xs
是一个指针),这两个示例都是即时完成的。我现在发现问题在于我没有使用
--release
标志。使用这面旗子使它很快。在我的问题中,我也做出了错误的假设,
vec宏将生成大量的
push()
调用,这是不正确的。所以我接受这个答案。啊,好的。然后,我将撤消编辑以进行编辑。请注意,您还可以准确地配置cargo.toml文件中得到优化的内容。这是一个切线,但是您是否有“calloc()也会查看内存是否先清零”的引用?它怎么能在比实际归零更少的时间内检查呢?这不是最可靠的来源,但我要离开这里了。我给出它的方式似乎暗示了与零的比较,但实际上它做了一个稍微不同的检查(根据这条评论)。
cargo build --release
time ../target/release/test

real   0.024s 
usr    0.004s
sys    0.008s
gcc -O3 test.c 
time ./a.out

real   0.023s
usr    0.004s
sys    0.004s`