我们是否有任何算法来优化布尔表达式

问题描述 投票:0回答:1

假设我们有这样的表达式:

(Rule1 && Rule2 && Rule3)

其中

Rule1
Rule2
Rule3
是返回 true 或 false 的
REST
调用。

我想根据表达式优化 REST 调用。 在引用的示例中,如果其中一条规则违反,则无需评估其他规则。

如果出现

(Rule1 || Rule2 || Rule3)
我想立即解雇所有人员,或者尝试获得第一个正确的结果,然后忽略其他的。

这就是编译器评估布尔表达式的方式。如果我必须用 Java 或任何现代编程语言来实现这一点,我们是否有任何标准算法?

algorithm compiler-optimization compiler-construction
1个回答
1
投票

大多数现代语言支持短路求值,仅当第一个参数不能确定整个表达式时才求值第二个参数。因此,在

(Rule1 && Rule2 && Rule3)
中,如果 Rule1 为 false,则不会评估 Rule2。同样在
(Rule1 ||Rule2 || Rule3)
如果规则 1 为 true,则不会评估规则 2。

确定“第一个参数”的约定是从左到右。这是因为大多数现代编程语言仍然遵循西方的书写规则。因此,最大限度地减少浪费周期的“算法”是:

  • 对于布尔 AND,最左边的参数应该是最有可能为假的一个,第二个参数是下一个最有可能为假的,依此类推
  • 对于布尔 OR,最左边的参数应该是最有可能为 true 的参数,第二个参数 yadda yadda

我们如何确定哪个论点最有可能是错误的?根据我们掌握的有关系统的信息,使用我们的技能和判断。或者猜测我们是否没有足够的信息。这可能是一个容易出现过早优化的领域。

最后,解决这个问题:

如果有像

(Rule1 && (Rule2 ||
  Rule3))&&Rule4
这样的复杂表达式,这里我会先评估Rule4

您需要将表达式写为

(Rule4 && Rule1 && (Rule2 || Rule3))
© www.soinside.com 2019 - 2024. All rights reserved.