【发布时间】:2021-07-25 14:29:48
【问题描述】:
据我了解,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?
【问题讨论】:
-
性能上不太可能有任何差异。这两个操作都映射到对 cpu 寄存器的简单操作
-
启用优化的构建,并比较生成的汇编代码。
-
但是异或和减法不是取消设置位的正确方法。使用否定掩码应用 ANDing。
-
作为一些关于手动优化代码的一般提示:像这样的微优化几乎不值得。并且总是 进行基准测试和测量,以找出程序中最重要的两个 瓶颈,然后只将精力集中在这些部分上。最后,手动优化代码通常会使代码变得非常复杂,难以阅读、理解和维护,因此请始终包含大量关于代码的文档和 cmets,以及它为什么这样做。
-
@B.Nadolson "我的理解是 XOR 会影响分支预测。" 引用?
标签: c xor micro-optimization branch-prediction