Java for循环的速度:超过Big-O符号

Java for循环的速度:超过Big-O符号,java,for-loop,break,Java,For Loop,Break,这个问题与Big-O符号无关 这正是让我惊讶的地方。考虑代码片段: for(int i = 0; i < 13; i++){ long beg = System.currentTimeMillis(); int k, l; for(l = 0; l < 1000000; l++){ for(int j = 0; j < 65535; j++) { if(pixels[j]

这个问题与Big-O符号无关

这正是让我惊讶的地方。考虑代码片段:

for(int i = 0; i < 13; i++){
        long beg = System.currentTimeMillis();

        int k, l;

        for(l = 0; l < 1000000; l++){
            for(int j = 0; j < 65535; j++) {
                if(pixels[j] == pixels[l])
                    k = j;
                    //j = 70000;
            }
        }

        System.out.println(System.currentTimeMillis() - beg + " ms");
        System.out.println();
    }
for(int i = 0; i < 13; i++){
        long beg = System.currentTimeMillis();

        int k, l;

        for(l = 0; l < 1000000; l++){
            for(int j = 0; j < 65535; j++) {
                if(pixels[j] == pixels[l])
                    //k = j;
                    j = 70000;
            }
        }

        System.out.println(System.currentTimeMillis() - beg + " ms");
        System.out.println();
    }
for(int i=0;i<13;i++){
long beg=System.currentTimeMillis();
int k,l;
对于(l=0;l<1000000;l++){
对于(int j=0;j<65535;j++){
if(像素[j]==像素[l])
k=j;
//j=70000;
}
}
System.out.println(System.currentTimeMillis()-beg+“ms”);
System.out.println();
}
输出为:

10毫秒

30毫秒

10毫秒

10毫秒

10毫秒

10毫秒

10毫秒

10毫秒

10毫秒

10毫秒

10毫秒

现在,考虑代码片段:

for(int i = 0; i < 13; i++){
        long beg = System.currentTimeMillis();

        int k, l;

        for(l = 0; l < 1000000; l++){
            for(int j = 0; j < 65535; j++) {
                if(pixels[j] == pixels[l])
                    k = j;
                    //j = 70000;
            }
        }

        System.out.println(System.currentTimeMillis() - beg + " ms");
        System.out.println();
    }
for(int i = 0; i < 13; i++){
        long beg = System.currentTimeMillis();

        int k, l;

        for(l = 0; l < 1000000; l++){
            for(int j = 0; j < 65535; j++) {
                if(pixels[j] == pixels[l])
                    //k = j;
                    j = 70000;
            }
        }

        System.out.println(System.currentTimeMillis() - beg + " ms");
        System.out.println();
    }
for(int i=0;i<13;i++){
long beg=System.currentTimeMillis();
int k,l;
对于(l=0;l<1000000;l++){
对于(int j=0;j<65535;j++){
if(像素[j]==像素[l])
//k=j;
j=70000;
}
}
System.out.println(System.currentTimeMillis()-beg+“ms”);
System.out.println();
}

输出为:“164596毫秒”,以此类推。为什么?

您每次都将j重置为0

这意味着你有一个无限循环

for(int j = 0; j < 65535; j++) {
            //break;
            j = 0;
        }
for(int j=0;j<65535;j++){
//中断;
j=0;
}

另外,请注意,在第一个示例中,JIT可能会完全删除两个嵌套循环,因为它们什么也不做。这是我的第一个猜测……但是,请解释一下它如何适用于这些新代码。我们的第一个示例是将一个变量分配给另一个变量,因此基本上是内存中的指针,这是一个非常简单/廉价的操作。编译器可能会对for循环进行优化,使其速度更快。在第二个例子中,您实际上是在更改循环的行为,以及为变量指定一个较大的原始值。这可能无法以同样的方式进行优化。这实际上是我的疑问。编译器优化了什么以及如何优化?那么,根据您的说法,如果第一个示例优化为“内存中的指针”操作,您是否期望像素[0]=j;以同样的方式进行优化?事实上这并没有发生。现在告诉我你如何解释这种现象