取消指针引用与字节移位

Dereferencing a pointer vs shifting for bytes?

本文关键字:字节 指针 引用 取消      更新时间:2023-10-16

我正在努力提高一个执行大量位操作的应用程序的性能。

一种操作是:

c |= (1 << i)

其中我想在一个字节中设置一个比特。我想也许用一个查找表来获取8个值中的每一个。数组访问比原来的位操作更快还是更慢?

或者有更好的方法吗?

在任何现代计算机体系结构上,移位操作都将在单个CPU周期内完成。如果表在CPU缓存中,则表查找可能只需要一个周期;否则,它将花费更长的时间(如果内存已交换到磁盘,则可能需要数百万倍的时间)。

在较旧的ARM处理器(9系列及更早版本)上,转换需要两个周期(假设i不是常数);在这种情况下,表查找可能会更快——如果表的基址寄存器已经设置好,并且表在缓存中,并且处理器有缓存,则只需一个周期。

一些非常旧的处理器没有快速移动的硬件,在这种情况下,查找可能会快得多,尤其是在CPU速度与当时的内存速度相同的情况下。

因此,如果你发现自己处于20世纪80年代,或者正在为硬盘驱动器编写固件,那么这可能会很有用;但一定要测量它。

许多体系结构都有一条用于单比特集(或清除)的专用指令,它比序列快得多(生成常数1,移位,逐位or)。在这种情况下,给编译器一些它可以识别为可以用位集指令替换的东西是最重要的。

使用查找表可能会阻止此优化。

坚持使用简单的代码。看看编译器生成的程序集,它可能会让你大吃一惊。