gpt4 book ai didi

java - 用于优化循环语句的 JVM 选项

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:59:18 31 4
gpt4 key购买 nike

我在学校被告知,修改 for 循环 的索引变量是一种不好的做法:

示例:

for(int i = 0 ; i < limit ; i++){
if(something){
i+=2; //bad
}
if(something){
limit+=2; //bad
}
}

争论的焦点是一些编译器优化可以优化循环,而不是在每个循环中重新计算索引和边界。

我在 java 中做了一些测试,似乎默认情况下每次都会重新计算索引和边界。

我想知道是否可以在 JVM HotSpot 中激活这种功能?

例如优化这种循环:

for(int i = 0 ; i < foo.getLength() ; i++){   }

无需编写:

int length = foo.getLength()
for(int i = 0 ; i < length ; i++){ }

这只是一个例子,我很想尝试看看改进。

编辑

根据 Peter Lawrey 的回答为什么在这个简单的例子中 JVM 不内联 getLength() 方法?:

public static void main(String[] args) {
Too t = new Too();
for(int j=0; j<t.getLength();j++){
}
}


class Too {

int l = 10;
public Too() {
}
public int getLength(){
//System.out.println("test");
return l;
}
}

在输出中“test”打印了 10 次。

我认为优化这种执行可能会很好。

编辑 2:看来我误会了...

我已经删除了 println,实际上分析器告诉我在这种情况下方法 getLength() 甚至没有被调用一次。

最佳答案

I've made some test in java and it seems that by default index and bound are recalculate each time.

根据 Java 语言规范,这:

for(int i = 0 ; i < foo.getLength() ; i++){   }

表示getLength()在每次循环迭代时调用。 Java 编译器只允许 移动 getLength()如果他们可以有效地证明它不会改变可观察到的行为,则调用循环。

(例如,如果 getLength() 只是返回某个变量的值,那么 JIT 编译器有可能内联调用。如果在内联之后,它可以推断出该变量赢了如果不改变(在某些假设下),它可以应用提升优化。另一方面,如果 getLength() 涉及获取并发或同步集合的长度,则允许提升优化的可能性微乎其微。 . 因为其他线程的潜在操作。)

这就是编译器允许做的事情。

I'm wondering if it's possible to activate this kind of feature in the JVM HotSpot?

简单的答案是否定的。

您似乎在建议一个编译器开关,告诉/允许编译器忽略 JLS 规则。没有这样的开关。这样的转换将是一个坏主意。它可能会导致正确/有效/工作程序中断。考虑一下:

class Test {
int count;

int test(String[] arg) {
for (int i = 0; i < getLength(arg); i++) {
// ...
}
return count;
}

int getLength(String[] arg) {
count++;
return arg.length;
}
}

如果允许编译器移动 getLength(arg)在循环外调用,它会改变调用该方法的次数,因此会改变 test 返回的值方法。

改变正确编写的 Java 程序行为的 Java 优化不是有效的优化。 (请注意,多线程往往会混淆水域。JLS,特别是内存模型规则,允许编译器执行优化,这可能导致不同线程看到应用程序状态的不一致版本......如果它们不同步正确,导致从开发人员的角度来看是不正确的行为。但真正的问题在于应用程序,而不是编译器。)


顺便说一下,您不应该更改循环体中的循环变量的一个更有说服力的理由是它会使您的代码更难理解。

关于java - 用于优化循环语句的 JVM 选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9336704/

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