我正在努力提高执行大量操作的应用程序的性能。
一项操作是:
c |= (1 << i)
我想在一个字节中设置一个位。我在考虑使用查找表来将8个值中的每个值都输入到OR中。数组访问是否比原始位操作更快或更慢?
或许有更好的方法吗?
答案 0 :(得分:6)
在任何现代计算机体系结构中,移位操作将在单个CPU周期内完成。如果表在CPU缓存中,则表查找可能只需一个周期;否则它将花费更多,更长的时间(如果内存已被交换到磁盘,可能会长几百倍)。
在较旧的ARM处理器(9系列及更早版本)上,移位需要两个周期(假设i
不是常量);在这种情况下,表查找可能更快 - 一个周期,如果表的基本寄存器已经设置,并且表在缓存中,并且处理器根本没有缓存。
一些非常旧的处理器没有快速移位硬件,在这种情况下查找速度可能会快得多 - 尤其是当CPU速度趋于与当时的内存速度相同时。
因此,如果您发现自己在20世纪80年代,或者为硬盘驱动器编写固件,那么这可能是有用的;但要确保你测量它是确定的。
答案 1 :(得分:0)
许多架构都有单比特集(或清除)的专用指令,它比序列快得多(生成常数1,移位,按位或)。在这种情况下,给编译器一些它可以识别为可以用bitset指令替换的东西是最重要的。
使用查找表可能会阻止此优化。
坚持使用简单的代码。看看编译器生成的程序集,可能会让你感到惊讶。