0

我只是查看了 AndPredicate 和 ALWAYS_FALSE 谓词,没有发现任何迹象表明 AndPredicate 注意到 ALWAYS_FALSE 组件自身短路。

如果 Predicate 已知为 ALWAYS_TRUE 或 ALWAYS_FALSE,似乎有许多优化机会。例如,Iterables.filter(Iterable,Predicate) 是否可以只返回带有 ALWAYS_TRUE 谓词的输入 Iterable(可能是不可修改的视图),以及带有 ALWAYS_FALSE 谓词的空 Iterable?

类似地,对于此类优化,包含 ALWAYS_FALSE 的 AndPredicate 可以被视为 ALWAYS_FALSE(以及带有 ALWAYS_TRUE 的 OrPredicate 等)

这种优化是否已经到位,我在随意搜索时错过了它,还是有原因(副作用行为改变?)为什么这不是一个好主意?

4

1 回答 1

3

这不是一个好主意是有原因的:它最终不会成为“优化”。

具体来说,受此优化影响的用户只是 和 用户的一小Predicates.and部分Predicates.or。让我们假设这是 1%,但老实说,我认为这可能是慷慨的。没有多少用户有意传递ALWAYS_TRUEPredicates.or.

现在,1% 的胜利是否值得检查是否可以优化到 99% 的成本?为了加快这 1%,你已经放慢了其他所有人的速度——而其他所有人的数量都大大超过了被加速的用户。

JIT 可能会进行足够多的内联以找出它可以进行等效优化——即确定if条件始终为true,并跳过 if 语句。但是 JIT 进行了大量优化,只进行平均而言值得花时间检查优化是否适用的优化。

于 2013-08-09T17:44:20.710 回答