我正在试着找到最快的方法来反转铁 rust 中的布尔值?即

false => true
true => false

对于我的应用程序,我不关心布尔值的当前值,只关心它是否被翻转.对于我的应用程序(Atkin的筛子-Eratosthenes筛子的改进版本),这将需要执行大量的次数,所以让它尽可能快地运行会很好.目前我的代码是:

item[i] = !item[i]

因为,(如上所述)Item[i]的当前值是无关紧要的,我相信有一种更快的(可能是按位的)方法可以做到这一点.然而,我有点Rust ,一直找不到它,有人能给我更好的建议吗?

谢谢,

推荐答案

无所谓.编译器在这一点上会比你聪明,并 Select 它所知道的最快的方法.您使用的确切语法并不重要.你可能认为这是显而易见的,但这是一个非常常见的错误.这是在使用Cargo 构建或运行项目时使用--release来完成的.如果您忘记了这一步,编译器甚至不会try 加速您的代码,并且对代码执行进行计时变得毫无意义.

更重要的是如何访问布尔值所在的内存.如果您一次在一个值或小区域上执行大量工作,请try 将您正在处理的内存保留在堆栈上.高速缓存局部性还意味着读取相邻高速缓存线将比在内存中的位置之间跳转更快.如果您最近访问过内存,或者CPU猜测您即将访问它,则内存更有可能位于缓存中.

也有像bit-vecbitvec这样的 crate ,它们将每个布尔值减少到使用一位.这对于提高内存使用率非常有效(准确地说,提高了8倍),但对性能的影响非常小.不过,我会避开bitvec crate .大约一个月前,我做了一些基准测试,结果表现非常糟糕.

您是否需要一次只处理一个布尔值?如果可能的话,试着用完整的单词来记忆.在u64上进行按位运算可能需要完全相同的时间,但您的工作效率是64倍.

Rust相关问答推荐

当Option为None时,Option数组是否占用Rust中的内存?

在Rust中,有没有一种方法让我定义两个 struct ,其中两个都遵循标准 struct ?

为什么BitVec缺少Serialize trait?

如何模拟/创建ReqData以测试Actix Web请求处理程序?

无法定义名为&new&的关联函数,该函数的第一个参数不是self

为什么`AlternateScreen`在读取输入键时需要按Enter键?

try 创建随机数以常量

Rust Axum 框架 - 解包安全吗?

tokio::spawn 有和没有异步块

如何正确使用git2::Remote::push?

Rust 生命周期:这两种类型声明为不同的生命周期

我的 Axum 处理程序无法编译:未实现 IntoResponse 特征

为什么 Rust 允许写入不可变的 RwLock?

是否可以预测堆栈溢出?

使用部分键从 Hashmap 中检索值

匹配结果时的简洁日志(log)记录

如何将 while 循环内的用户输入添加到 Rust 中的向量?

Rust 为什么 (u32, u32) 的枚举变体的大小小于 (u64)?

为什么 Rust 中的关联类型需要明确的生命周期注释?

有什么办法可以用 Rust 访问 Windows 最近的文件夹吗?