翻转布尔值的最快方法



我正试图找到在rust中翻转布尔值的最快方法?即

false => true
true => false

对于我的应用程序,我不关心布尔值的当前值,只关心它是否翻转。对于我的应用程序(Atkin筛-Eratosthenes筛的改进版(,这将需要执行大量操作,因此最好让它尽可能快地运行。目前我的代码是:

item[i] = !item[i]

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

谢谢,

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

更重要的是如何访问布尔值所在的内存。如果一次对一个值或一个小区域做大量工作,请尝试将正在处理的内存保留在堆栈上。缓存局部性还意味着读取相邻缓存行的速度将比在内存中的位置之间跳跃更快。如果你最近访问了内存,或者CPU猜测你即将访问内存,那么内存更有可能在缓存中

还有像bit-vecbitvec这样的板条箱,它们将每个布尔值减少为使用单个位。这对于提高内存使用率非常好(确切地说是提高了8倍(,但对性能的影响非常小。不过我会避开bitvec机箱。大约一个月前,我做了一些基准测试,表现非常糟糕。

你需要一次处理一个布尔值吗?如果可能的话,试着处理整个单词的记忆。u64上的位操作可能需要完全相同的时间,但您可以获得64倍的生产力。

由于在Rust中,布尔变量表示为8位无符号整数,0表示false,1表示true,因此编译器可以通过计算值与1的异或来实现无分支的求反。

话虽如此,虽然我不熟悉Atkin筛,至少对于Eratosthenes筛,但你真的想使用位域而不是布尔。但同样的技巧也可以用来避开树枝。

相关内容

最新更新