相关疑难解决方法(0)

为什么40亿次迭代的Java循环只需2 ms?

我在配备2.7 GHz Intel Core i7的笔记本电脑上运行以下Java代码.我打算让它测量完成2 ^ 32次迭代循环所需的时间,我预计大约需要1.48秒(4/2.7 = 1.48).

但实际上它只需要2毫秒,而不是1.48秒.我想知道这是否是下面任何JVM优化的结果?

public static void main(String[] args)
{
    long start = System.nanoTime();

    for (int i = Integer.MIN_VALUE; i < Integer.MAX_VALUE; i++){
    }
    long finish = System.nanoTime();
    long d = (finish - start) / 1000000;

    System.out.println("Used " + d);
}
Run Code Online (Sandbox Code Playgroud)

java jvm for-loop

113
推荐指数
5
解决办法
1万
查看次数

JIT没有优化涉及Integer.MAX_VALUE的循环

在写另一个问题的答案时,我注意到JIT优化的一个奇怪的边界情况.

以下程序不是 "Microbenchmark",也不是为了可靠地测量执行时间(如另一个问题的答案中所指出的).它仅用作MCVE来重现该问题:

class MissedLoopOptimization
{
    public static void main(String args[])
    {
        for (int j=0; j<3; j++)
        {
            for (int i=0; i<5; i++)
            {
                long before = System.nanoTime();
                runWithMaxValue();
                long after = System.nanoTime();
                System.out.println("With MAX_VALUE   : "+(after-before)/1e6);
            }
            for (int i=0; i<5; i++)
            {
                long before = System.nanoTime();
                runWithMaxValueMinusOne();
                long after = System.nanoTime();
                System.out.println("With MAX_VALUE-1 : "+(after-before)/1e6);
            }
        }
    }

    private static void runWithMaxValue()
    {
        final int n = Integer.MAX_VALUE;
        int i = …
Run Code Online (Sandbox Code Playgroud)

java jit jvm-hotspot compiler-optimization

49
推荐指数
1
解决办法
1394
查看次数

如果重复使用相同的代码,为什么Java会更快?

给出以下代码:

public class Test{

    static int[] big = new int [10000];

    public static void main(String[] args){
        long time;
        for (int i = 0; i < 16; i++){
            time = System.nanoTime();
            getTimes();
            System.out.println(System.nanoTime() - time);
        }    
    }
    public static void getTimes(){
        int d;
        for (int i = 0; i < 10000; i++){
            d = big[i];
        }    
    }
}
Run Code Online (Sandbox Code Playgroud)

输出显示持续时间递减趋势:

171918
167213
165930
165502
164647
165075
203991
70563
45759
43193
45759
44476
45759
52601
47897
48325
Run Code Online (Sandbox Code Playgroud)

为什么getTimes在执行8次或更多次后,在不到三分之一的时间内执行相同的代码?(编辑:它并不总是发生在第8次,但从5日到10日)

java optimization jit jvm jvm-hotspot

11
推荐指数
1
解决办法
1122
查看次数

如何编写Java for循环以避免重复计算上限

我一般写

for (int i = 0, n = someMethod(); i < n; i++)
Run Code Online (Sandbox Code Playgroud)

优先于

for (int i = 0; i < someMethod(); i++)
Run Code Online (Sandbox Code Playgroud)

避免someMethod() 重复计算.但是我不确定我什么时候需要这样做.Java在识别每次都会给出相同结果的方法时有多聪明,只需要在循环开始时执行一次?

java optimization jit

5
推荐指数
1
解决办法
762
查看次数