c++ - 按位非运算哪个更快 : precalculated table or `~`

标签 c++ cpu-architecture cpu-cache micro-optimization

理论上,在更快的现代 CPU 上:

  • 从表中接收 NOT 结果
  • 还是通过~(C语言)运算来计算?

假设所有表都适合 L1 缓存。

按位不:

uint8_t bitwise_not(uint8_t arg) { return ~arg; }

表不是:

// precalculcating table (once)
uint8_t table[0x100];
for (int i = 0; i < 0x100; ++i) { table[i] = ~static_cast<uint8_t>(i); }

// function
uint8_t table_not(uint8_t arg) { return table[arg]; }

// xor_not:
uint8_t xor_not(uint8_t arg) { return arg ^ 0xff; }

不是单个操作,而是数十亿次操作,从 L1 缓存读取是否比任何逻辑操作都快? (我认为 L1 更快,但无法证明。)

具体如何衡量?

最佳答案

都没有。只需在您的代码中内联使用 ~ 运算符。这是一条机器指令。一个函数调用或一个查表是几个。没有任何一种方法可以更快。

我无法解释您奇怪的认为 L1 缓存比寄存器快的想法。

关于c++ - 按位非运算哪个更快 : precalculated table or `~` ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34283080/

相关文章:

c++ - 在 LLVM 中,你如何检查一个 block 是否是一个合并 block

c++ - 在对象初始化之前访问C++ std::vector对象成员

cpu - 为什么不只预测两个分支?

assembly - 8086锁销和ASM LOCK前缀如何工作

c++ - "non-native"指针会损害缓存性能吗?

c++ - .NET 和 Linux 之间的 GUID/UUID 兼容性问题

spatial - 分析代码的空间和时间局部性

x86 - 什么特别地将 x86 缓存行标记为脏 - 任何写入,还是需要显式更改?

x86-64 - 预取写入是否会影响单核性能?

c++ - 如何通知我窗口已激活?