如何解决高性能位删除XOR 与减法
我的理解是 XOR 会干扰分支预测。
对于将运行很多次的操作,通过减法还是通过异或去除位更可取?
// For an operation that will run several million times ...
int encoding = 180391281; // Could be anything but we'll pick a number ...
#define REMOVE_BITS (128+64)
int bits_to_remove = encoding & REMOVE_BITS;
int encoding_with_bits_removed_xor_method = encoding ^ /*XOR*/ bits_to_remove; // BEST?
int encoding_with_bits_removed_subtract_method = encoding - /*SUB*/ bits_to_remove; // BEST?
解决方法
如果您深入研究数字电子电路;对于按位布尔运算(AND、OR、XOR、XNOR),每个位都可以并行执行,而对于加法/减法,则不能并行执行(最低位对的进位/借位会影响下一个最高位对的结果位,其中...)
然而; CPU 很复杂,为了让所有部分保持同步,通常所有东西(除了极少见的异步/无时钟设计,如 GreenArrays 的芯片)都会四舍五入到最接近的时钟周期;因此,可以在 0.5 个周期内完成的 XOR 将花费 1 个完整周期,而可以在 0.9 个周期内完成的 SUB 将花费相同的 1 个完整周期。
换句话说;一般来说,XOR(或 AND)和 SUB 之间的性能极不可能有任何差异(但我仍然更喜欢 XOR 或 AND,因为它“理论上对 CPU 来说更简单”,并且可能会降低功耗)。
一个更重要的考虑因素(特别是对于高级语言,其中有一个编译器应该为您进行微优化)是源代码的可读性。对于位删除,AND 是常见的做法,而 SUB 是不寻常的(更有可能使读者暂时混淆)。如果 XOR 可以帮助您避免 NOT(例如,a = b ^ c
并不比 a = b & (~c)
更难理解),则它是合理的;但是您可以颠倒术语(例如,将“位删除”替换为“位掩码”)并以 a = b & c
结尾而不带 NOT,如果您可以这样做,它可能会提高可读性。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。