Iterable.filter()可以跳过“常量”(包括短路)谓词的处理吗?

时间:2013-08-09 16:58:40

标签: java guava

我只是查看了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等)

这种优化是否已经到位,我在偶然搜索中错过了它,或者是否有原因(副作用行为发生变化?)为什么这不是一个好主意?

1 个答案:

答案 0 :(得分:3)

有理由说这不是一个好主意:它不会最终成为“优化”。

具体而言,受此优化影响的用户只占Predicates.andPredicates.or用户的一小部分。让我们说,为了论证的目的,这是1%,但老实说,我认为这可能是慷慨的。没有多少用户故意将ALWAYS_TRUE传递给Predicates.or

现在,是否值得花费1%的成本来检查是否可以优化到99%?为了加快1%的速度,你已经放慢了其他所有人的速度 - 其他人都大大超过了用户加速的速度。

JIT可能会做足够的内联,以确定它可以进行等效优化 - 即确定if条件总是true,并跳过if语句。但JIT经过大量优化,只进行优化,平均而言,这些优化值得花时间检查优化是否适用。