我只是查看了AndPredicate和ALWAYS_FALSE谓词,并没有发现AndPredicate注意到ALWAYS_FALSE组件短路的任何迹象。
如果已知Predicate为ALWAYS_TRUE或ALWAYS_FALSE,似乎可能存在许多优化机会。例如,Iterables.filter(Iterable,Predicate)是否可以使用ALWAYS_TRUE谓词返回输入Iterable(可能是不可修改的视图),以及带有ALWAYS_FALSE Predicate的空Iterable?
类似地,包含ALWAYS_FALSE的AndPredicate可以被认为是这种类型的优化的ALWAYS_FALSE(和带有ALWAYS_TRUE的OrPredicate等)
这种优化是否已经到位,我在偶然搜索中错过了它,或者是否有原因(副作用行为发生变化?)为什么这不是一个好主意?
答案 0 :(得分:3)
有理由说这不是一个好主意:它不会最终成为“优化”。
具体而言,受此优化影响的用户只占Predicates.and
和Predicates.or
用户的一小部分。让我们说,为了论证的目的,这是1%,但老实说,我认为这可能是慷慨的。没有多少用户故意将ALWAYS_TRUE
传递给Predicates.or
。
现在,是否值得花费1%的成本来检查是否可以优化到99%?为了加快1%的速度,你已经放慢了其他所有人的速度 - 其他人都大大超过了用户加速的速度。
JIT可能会做足够的内联,以确定它可以进行等效优化 - 即确定if
条件总是true
,并跳过if语句。但JIT经过大量优化,只进行优化,平均而言,这些优化值得花时间检查优化是否适用。