相关疑难解决方法(0)

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

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

示例:

for(int i = 0 ; i < limit ; i++){
    if(something){
        i+=2;      //bad
    }
    if(something){
        limit+=2;      //bad
    }
}
Run Code Online (Sandbox Code Playgroud)

参数是一些编译器优化可以优化循环,而不是重新计算索引并在每个循环中绑定.

我已经进行了一些测试,java似乎默认索引和绑定每次都会重新计算.

我想知道是否有可能激活这种功能JVM HotSpot

例如,优化这种循环:

for(int i = 0 ; i < foo.getLength() ; i++){   }
Run Code Online (Sandbox Code Playgroud)

无需写:

int length = foo.getLength()
for(int i = 0 ; i < length ; i++){   }
Run Code Online (Sandbox Code Playgroud)

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

编辑

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

public static void main(String[] args) {
   Too t = new …
Run Code Online (Sandbox Code Playgroud)

java optimization jvm loops

7
推荐指数
2
解决办法
3685
查看次数

for-each循环在JAVA内部如何工作?

我在进行函数调用时试图找到for-each循环的工作方式。请参阅以下代码,

public static int [] returnArr()
{
    int [] a=new int [] {1,2,3,4,5};
    return a;
}

public static void main(String[] args)
{
    //Version 1
    for(int a : returnArr())
    {
        System.out.println(a);
    }

    //Version 2
    int [] myArr=returnArr();
    for(int a : myArr)
    {
        System.out.println(a);
    }
}
Run Code Online (Sandbox Code Playgroud)

在版本1中,我在for-each循环中调用returnArr()方法,在版本2中,我显式调用returnArr()方法并将其分配给数组,然后对其进行迭代。两种方案的结果都相同。我想知道哪个更有效以及为什么。

我认为版本2会更高效,因为我不会在每次迭代中都调用method。但是令我惊讶的是,当我使用版本1调试代码时,我看到方法调用只发生过一次!

谁能解释一下它是如何工作的?当我为复杂对象编写代码时,哪个更有效/更好

java

4
推荐指数
2
解决办法
3916
查看次数

标签 统计

java ×2

jvm ×1

loops ×1

optimization ×1