微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

高性能位删除XOR 与减法

如何解决高性能位删除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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?