按位非操作哪个更快:预先计算的 table 或 `~`
Which is faster for bitwise NOT operation: precalculated table or `~`
理论上,在更快的现代 CPU 上:
- 收到来自 table
的 NOT 结果
- 或通过
~
(C语言)运算计算?
假设所有 table 都适合 L1 缓存。
按位不:
uint8_t bitwise_not(uint8_t arg) { return ~arg; }
Table 不是:
// 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更快,但无法证明。)
实际如何衡量?
都没有。只需在您的代码中内联使用 ~ 运算符。这是一条机器指令。函数调用或 table 查找是几个。没有任何一种方法可以更快。
我无法解释你奇怪的认为 L1 缓存比寄存器快的想法。
理论上,在更快的现代 CPU 上:
- 收到来自 table 的 NOT 结果
- 或通过
~
(C语言)运算计算?
假设所有 table 都适合 L1 缓存。
按位不:
uint8_t bitwise_not(uint8_t arg) { return ~arg; }
Table 不是:
// 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更快,但无法证明。)
实际如何衡量?
都没有。只需在您的代码中内联使用 ~ 运算符。这是一条机器指令。函数调用或 table 查找是几个。没有任何一种方法可以更快。
我无法解释你奇怪的认为 L1 缓存比寄存器快的想法。