Java for循环的速度:超过Big-O符号
这个问题与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]
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;以同样的方式进行优化?事实上这并没有发生。现在告诉我你如何解释这种现象