假设我们有这些不等式:

if (a*a+b*b>0) {
    ...
}

if (a*b+c*d>0) {
    ...
}

显然,它们都需要 2 次乘法才能求值。
问题是,我们是否真的需要计算 2 个全精度乘积来检查这些表达式是否为正?
是否有任何数学技巧可以让我编写 if 命令而无需评估 2 个产品?
会更快吗?
或者编译器可能会尽可能快地处理它?
我是不是多虑了?

编辑:
嗯,这升级很快。
我只想指出,我是在笼统地发言。无论如何,我不需要在我的任何项目中进行这样的微优化。
另外,是的,我可以省略第一个,因为它太琐碎了。可能第二个更有趣。

最佳答案

您的“我是不是想多了”问题表明您没有通过真正分析您的代码发现这是一个实际的瓶颈。所以我会说是的,你只是想过早地进行优化。

但是, 如果这确实是您的应用程序的主要性能关键部分,那么我现在能想到的唯一改进如下。由于实数的平方永远不会是负数,因此“a 的平方大于零”等同于“a 不为零”。因此,如果您的架构上的比较很快(嗯,那是相对的——比乘法快),那么

if (a*a+b*b>0) {
    ...
}

可以写成
if (a || b) {
    ...
}

(前提是没有出现极端情况。如果变量是表示实数的有符号整数或浮点数,那么这应该没问题。但是,如果涉及一些无符号整数溢出或复数,那么您将不得不执行额外的检查,在这一点上,如果没有真正的分析,很难推断出相对性能。)

对于第二种情况,我没有这样“聪明”的“优化”,但也许其他人可以想出类似的东西 - 当且仅当绝对必要时。 并非如此——当性能不重要时,代码可读性优于性能。

关于c - C 中更快的不等式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20169014/

10-12 06:29