我试图找到一种最快的方法来翻转rust中的布尔值-即。
false => true
true => false
对于我的应用程序,我不关心布尔值的当前值,只关心它是否被翻转。对于我的应用程序(Atkin的Sieve-Eratosthenes的Sieve的改进版本),这将需要执行大量的次数,所以最好让它尽可能快地运行。目前我的代码是:
item[i] = !item[i]
因为,(如前所述)item[i]的当前值是无关紧要的,我确信有一个更快的(可能是按位的)方法来做到这一点。但是,我有点生 rust ,还没有能够找到它,谁能给我一个更好的方法吗?
谢谢你,
2条答案
按热度按时间roqulrg31#
这没关系。编译器会在这方面比你更聪明,并选择它知道的最快的方法。你使用的确切语法并不重要。**但是,只有当你记得打开优化时才会出现这种情况。**你可能认为这是显而易见的,但这是一个非常常见的错误。在构建或运行带货物的项目时,这是使用
--release
完成的。如果你忘记了这一步,编译器甚至不会尝试加速代码,对代码执行计时也变得毫无意义。更重要的是你如何访问布尔值所在的内存。如果你一次对一个值或一个小区域做了很多工作,试着把你正在使用的内存放在堆栈上。缓存局部性也意味着读取相邻的缓存行比在内存中的不同位置之间跳转要快。如果您最近访问过内存,或者CPU猜测您即将访问内存,则内存更有可能该高速缓存中。
还有
bit-vec
和bitvec
这样的板条箱,它们将每个布尔值减少到使用一位。这对于提高内存使用率非常有用(确切地说是提高了8倍),但对性能的影响非常小。不过我还是会避免使用bitvec
板条箱。大约一个月前,我做了一些基准测试,性能绝对糟糕。你需要一次处理一个布尔值吗?如果可能的话,尝试处理整个内存字。在
u64
上进行位运算可能需要完全相同的时间,但是你的生产力是原来的64倍。6g8kf2rb2#
由于在Rust中,布尔变量被表示为8位无符号整数,0表示假,1表示真,因此编译器可以通过计算值与1的XOR来实现无分支的求反。
话虽如此,虽然我不熟悉阿特金的筛法,但至少对于埃拉托色尼的筛法来说,你确实希望使用位域而不是布尔值,但同样的技巧也可以用来避免分支。