取消指针引用与字节移位
Dereferencing a pointer vs shifting for bytes?
我正在努力提高一个执行大量位操作的应用程序的性能。
一种操作是:
c |= (1 << i)
其中我想在一个字节中设置一个比特。我想也许用一个查找表来获取8个值中的每一个。数组访问比原来的位操作更快还是更慢?
或者有更好的方法吗?
在任何现代计算机体系结构上,移位操作都将在单个CPU周期内完成。如果表在CPU缓存中,则表查找可能只需要一个周期;否则,它将花费更长的时间(如果内存已交换到磁盘,则可能需要数百万倍的时间)。
在较旧的ARM处理器(9系列及更早版本)上,转换需要两个周期(假设i
不是常数);在这种情况下,表查找可能会更快——如果表的基址寄存器已经设置好,并且表在缓存中,并且处理器有缓存,则只需一个周期。
一些非常旧的处理器没有快速移动的硬件,在这种情况下,查找可能会快得多,尤其是在CPU速度与当时的内存速度相同的情况下。
因此,如果你发现自己处于20世纪80年代,或者正在为硬盘驱动器编写固件,那么这可能会很有用;但一定要测量它。
许多体系结构都有一条用于单比特集(或清除)的专用指令,它比序列快得多(生成常数1,移位,逐位or)。在这种情况下,给编译器一些它可以识别为可以用位集指令替换的东西是最重要的。
使用查找表可能会阻止此优化。
坚持使用简单的代码。看看编译器生成的程序集,它可能会让你大吃一惊。
相关文章:
- 将字节数组转换为带有字节序问题的指针
- 向指针地址添加 20 个字节偏移量
- 将(N 个字节)无符号字符指针转换为浮点数和双 C++
- 通过浮点指针操作字节向量
- 复制后删除原始数组指针将前 3 个字节设置为 0
- 将uint64_t转换为字节时从不同大小的整数强制转换为指针
- C++向指针地址添加 4 个字节
- 将constexpr字节数组与缓冲区的一部分(指向数据的指针)进行比较
- 从字节指针读取位的差异
- 读取字节后丢失指针
- C++如何从文件中读取十六进制字节并将其存储为指针
- 以C++(Arduino)为单位比较指针到字节
- 2 个指针,0 字节相差但不相等
- Valgrind:将一个指针分配给另一个指针后丢失字节
- ::运算符 delete(指针) 返回释放的字节大小
- _declSpec(Align(16))不将指针与16个字节对齐
- i2c中的字节指针数组
- 如何在 JNA 中获取字节数组作为从 C 字节指针返回的返回
- reinterpret_cast<字符*>(p)或static_cast<字符*>((void*)p))表示字节指针差,哪个更好?
- c++到c#:有3个元素的字节指针数组等于什么?