翻转布尔值的最快方法

Pio*_*_11 2 boolean bit-manipulation rust

我正在尝试找到最快的方法来翻转 Rust 中布尔值的值?IE

false => true
true => false
Run Code Online (Sandbox Code Playgroud)

对于我的应用程序,我不关心布尔值的当前值,只关心它被翻转。对于我的应用程序(阿特金筛法 - 埃拉托斯特尼筛法的改进版本),这需要执行大量次,因此最好让它尽可能快地运行。目前我的代码是:

item[i] = !item[i]
Run Code Online (Sandbox Code Playgroud)

因为,(如上所述) item[i] 的当前值是无关紧要的,我确信有一种更快的(可能是按位的)方法来做到这一点。但是,我有点生锈,一直找不到它,有人可以建议我更好的方法吗?

谢谢,

Loc*_*cke 7

没关系。编译器会在这方面比你聪明,并选择它知道的最快的方法。您使用的确切语法并不重要。然而,只有当您记得打开优化时才会出现这种情况。您可能认为这是显而易见的,但这是一个极其常见的错误。这是--release在使用货物构建或运行项目时完成的。如果您忘记了这一步,编译器甚至不会尝试加速您的代码,并且计时代码执行变得毫无意义。

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

还有像bit-vecand之类的板条箱bitvec,它们将每个布尔值减少为使用一位。这对于提高内存使用率非常有用(准确地说是提高了 8 倍),但性能成本却非常小。bitvec不过我会避开板条箱。大约一个月前,我做了一些基准测试,性能非常糟糕。

您需要一次处理一个布尔值吗?如果可能的话,尝试记忆整个单词。a 上的按位运算u64可能会花费完全相同的时间,但您的生产率提高了 64 倍。