我正在努力提高执行大量位操作的应用程序的性能。
一种操作是:
c |= (1 << i)其中我想在一个字节中设置一个位。我在想也许可以使用一个查找表来让8个值中的每一个都进行OR运算。数组访问会比原始的位操作更快还是更慢?
或者有没有更好的方法?
发布于 2012-01-31 02:21:28
在任何现代计算机体系结构上,移位操作将在单个CPU周期内完成。如果表在CPU缓存中,则查找表可能只需要一个周期;否则将花费更长的时间(如果内存已交换到磁盘,则可能长达数百万倍)。
在较早的ARM处理器(9系列及更早版本)上,移位需要两个周期(假设i不是常量);在这种情况下,表查找可能会更快-如果表的基址寄存器已经设置,并且表在缓存中,并且处理器有缓存,则只需要一个周期。
一些非常老的处理器没有快速移位硬件,在这种情况下,查找可能会快得多-特别是在CPU速度往往与内存速度相同的情况下。
因此,如果您发现自己处于20世纪80年代,或者正在为硬盘驱动器编写固件,那么这可能会很有用;但请确保您对其进行了测量以确定。
发布于 2012-01-31 02:59:33
许多体系结构都有一个用于设置(或清除)单个位的专用指令,它比序列(生成常量1、移位、按位或)快得多。在这种情况下,给编译器提供一些它可以识别为可用位集指令替换的东西是最重要的。
使用查找表可能会阻止这种优化。
坚持使用简单的代码。看看编译器生成的程序集,你可能会大吃一惊。
https://stackoverflow.com/questions/9068631
复制相似问题