【发布时间】:2018-12-14 22:24:47
【问题描述】:
我正在与一个决定自行处理集合的外部库合作。不使用它或更新不在我的控制范围内。要使用这个第三方“集合”的元素,它只返回迭代器。
在代码审查期间提出了一个问题,即在代码中使用多个返回以获得性能。我们都同意(在团队内部)单次返回代码更具可读性,但有些人担心优化。
我知道过早的优化是不好的。这是另一天的话题。
我相信 JIT 编译器可以处理这个问题并跳过不需要的迭代,但找不到任何信息来支持它。 JIT 有这种能力吗?
手头问题的代码示例:
public void boolean contains(MyThings things, String valueToFind) {
Iterator<Thing> thingIterator = things.iterator();
boolean valueFound = false;
while(thingIterator.hasNext()) {
Thing thing = thingIterator.next();
if (valueToFind.equals(thing.getValue())) {
valueFound = true;
}
}
return valueFound;
}
VS
public void boolean contains(MyThings things, String valueToFind) {
Iterator<Thing> thingIterator = things.iterator();
while(thingIterator.hasNext()) {
Thing thing = thingIterator.next();
if (valueToFind.equals(thing.getValue())) {
return true;
}
}
return false;
}
【问题讨论】:
-
为什么不在
while循环中使用break?但我很确定编译器将不会在第一个示例的早期终止循环。它如何知道不再需要以下迭代? -
这两个示例甚至没有相同的行为。第一个将返回集合的最后一个元素是否等于
valueToFind,而第二个将返回valueToFind是否在集合中的任何位置。 -
是的,在示例代码中可以看出,中断会删除不必要的迭代。
-
我怀疑它会这样做。
valueFound = valueToFind.equals(thing.getValue());有潜在的副作用,编译器会尽量避免抑制。 -
我非常怀疑 JIT 编译器会做这样的事情,因为它是根据方法和方法被调用的次数来编译的。
标签: java performance jit