【发布时间】:2015-11-17 04:01:17
【问题描述】:
我正在研究的算法必须经常检查某个任意整数值“x”是否小于、大于或等于另一个任意整数值“y”。我实现它的语言是 C。
一种天真的方法是使用 if-then-else 分支来检查这一点,但这不会以最佳方式工作,因为处理器的分支预测器会搞砸。我试图仅使用算术/逻辑评估以及按位运算来实现这种比较,但老实说,我的大脑现在卡住了。
我将调用函数 f(x, y)。如果 x y。
我的一个想法是评估:
x = 3 * (x > y)
当 x > y 时返回 3,否则返回 0。如果 x == 0 使用一些按位运算符和条件 x == y 或 x
最后,我正在寻找任何函数 f(x, y),无论是否使用 bithacks,它都能以最少的操作次数为我提供结果;它只需要快。因此,如果您有任何其他我可能没有考虑过的想法,也非常感谢您向我指出另一个解决方案。
【问题讨论】:
-
您的编译器可能不得不发出比较指令和分支,以获得正确的比较结果。在尝试过早优化之前查看汇编代码。如果速度是一个很大的问题,您可能会使用完全不同的方法来并行评估等。但这在很大程度上取决于您的架构、编译器和自己的能力。
-
您的 x 和 y 的域是什么?它们是整数吗?它们可以是负数吗?他们可以有不同的标志吗?
-
嗯,大多数主要处理器都有条件移动,所以......除非立即需要结果,否则它或多或少是免费的操作。当然,如果你有一个依赖链,那么比较和移动都会开始(但是,这就像 5-6 个周期......)。
-
你真的认为调用一个函数来比较两个整数比最优秀的大脑可以在 CPU 和编译器中进行的优化更有效吗?
-
编写您的编译器的人已经研究了所有的 bithacks 技巧,然后是一些。如果有一个棘手的做事方式,编译器知道这一点。但是如果你对代码进行了足够的混淆,你最终可能会得到编译器不理解的东西。
标签: c algorithm optimization bit-manipulation