gpt4 book ai didi

java - Java 编译器可以优化循环以提早返回吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:00:53 26 4
gpt4 key购买 nike

我正在与决定自行处理馆藏的外部图书馆合作。不使用它或更新是我无法控制的。要使用此第三方“集合”的元素,它只返回迭代器。

在代码审查期间出现了一个关于在代码中有多个返回值以获得性能的问题。我们都同意(在团队内部)单次返回代码更具可读性,但有些人担心优化。

我知道过早的优化是不好的。这是另一天的话题。

我相信 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;
}

对比

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;
}

最佳答案

We all agree the code is more readable with a single return.

不是真的。这只是老派的结构化编程,当时函数通常不会保持较小的规模,并且保持值不可变的范例还不流行。

虽然有争议,但使用非常小的方法(几行代码)并在不同点返回并没有错。例如,在递归方法中,您通常至少有一个立即返回的基本情况,以及另一个返回递归调用返回值的基本情况。

通常你会发现创建一个额外的结果变量,只是为了保存返回值,然后确保函数的其他部分没有覆盖结果,当你已经知道你可以返回时,只会产生噪音,这使得它可读性不高。读者必须处理认知重载才能看到结果没有进一步修改。在调试过程中,这会更加痛苦。

我不认为你的例子是过早的优化。它是搜索算法的逻辑和关键部分。这就是为什么您可以从循环中 break ,或者在您的情况下,只返回值。我不认为 JIT 可以轻松地意识到它应该打破循环。如果您在集合中找到其他内容,它不知道是否要将变量改回 false。 (我不认为意识到 valueFound 不会变回 false 是多么聪明)。

在我看来,您的第二个示例不仅更具可读性(valueFound 变量只是额外的噪音)而且速度更快,因为它在完成工作时才返回。如果在设置 valueFound = true 之后放置一个 break,第一个示例会一样快。如果您不这样做,并且您有一百万个项目需要检查,而您需要的项目排在第一位,那么您将白白比较所有其他项目。

关于java - Java 编译器可以优化循环以提早返回吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53780994/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com