performance - 我应该如何有效地初始化 `Arc<[u8; 65536]>`?

标签 performance rust

我正在编写一个创建大型数组的 Arc 对象的应用程序:

use std::sync::Arc

let buffer: Arc<[u8; 65536]> = Arc::new([0u8; 65536]);

分析此代码后,我发现正在发生 memmove,这使它变慢了。对于 Arc::new 的其他调用,编译器似乎足够聪明,无需 memmove 即可初始化存储的数据。

信不信由你,上面的代码比:

use std::sync::Arc;
use std::mem;

let buffer: Arc<[u8; 65536]> = Arc::new(unsafe {mem::uninitialized})

这有点令人惊讶。

欢迎提供见解,我认为这是一个编译器问题。

最佳答案

是的,现在,您必须依靠优化,显然,在这种情况下并没有这样做。我不确定为什么。

我们还在研究放置新功能,这将能够让您明确地告诉编译器您想要直接在堆上初始化它。参见 https://github.com/rust-lang/rfcs/pull/809 (和 https://github.com/rust-lang/rfcs/pull/1228 提出的更改对于这个问题无关紧要)。一旦实现,这应该有效:

let buffer: Arc<_> = box [0u8; 65536];

关于performance - 我应该如何有效地初始化 `Arc<[u8; 65536]>`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32016187/

相关文章:

sql-server - SQL Server 使用参数导致结果缓慢

java - log4j 性能

performance - Scala 函数式编程比传统编码慢吗?

rust - 这行中的双冒号是什么意思?

rust - 我如何将 'pass down' 功能标志标记为 Cargo 中的子依赖项?

c# - 如何使用 IEqualityComparer 加速多个字段的比较?

c - 复制数组的最快方法 - 它有什么问题吗?

split - 如何在回车符 (\r) 或 CRLF (\r\n) 行终止符上拆分流?

algorithm - 迭代BTreeSet和HashSet的时间复杂度是多少?

rust - 我什么时候应该调用 wasm-pack 生成的 free() 方法?