取消引用指针vs转移字节?

时间:2012-01-30 18:14:52

标签: c++ performance

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

一项操作是:

c |= (1 << i)

我想在一个字节中设置一个位。我在考虑使用查找表来将8个值中的每个值都输入到OR中。数组访问是否比原始位操作更快或更慢?

或许有更好的方法吗?

2 个答案:

答案 0 :(得分:6)

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

在较旧的ARM处理器(9系列及更早版本)上,移位需要两个周期(假设i不是常量);在这种情况下,表查找可能更快 - 一个周期,如果表的基本寄存器已经设置,并且表在缓存中,并且处理器根本没有缓存。

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

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

答案 1 :(得分:0)

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

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

坚持使用简单的代码。看看编译器生成的程序集,可能会让你感到惊讶。