Java 对于带有和不带有空主体的循环,需要相同的时间

Java 对于带有和不带有空主体的循环,需要相同的时间,java,performance,for-loop,Java,Performance,For Loop,我注意到以下两个循环占用的时间相同:~1.2秒 double count=Math.pow(10,9); for(int i=0;i

我注意到以下两个循环占用的时间相同:~1.2秒

double count=Math.pow(10,9);
for(int i=0;i
double count=Math.pow(10,9);
for(int i=0;i

为什么他们会在同一时间完成?这些for循环只增加一个比较,因此每次迭代执行两个操作。我想第一个要花3倍的时间才能完成,因为它有7个动作,而第二个动作有2个动作。

当然循环的内部代码不需要cpu,所以可能会有相同的时间。

如果循环内部的代码在运行后不影响代码,编译器将跳过循环内的所有操作以优化性能


查看以下链接以了解更多详细信息:

答案不是因为优化(或者仅仅是优化——字节码是生成的)。这是因为循环是一个浮点循环,浮点运算的代价是出了名的昂贵。因此,内部代码相对较快,或者对总体运行时间来说无关紧要(正如@j11john所提到的)

如果更改循环,使其基于
int
,则这两个窗体将以明显不同的速度运行

        long start = System.nanoTime();
        int count = (int)Math.pow(10, 9);
        int x = 0;
        for(int i = 0;i<count;i++) {
            int y = 10;
             x = 3*y;
            x = 100*y*x;
            int[] arr = new int[3];
            arr[0] = 1;
        
        }
        System.out.println((System.nanoTime()-start)/1_000_000_000.);
    }
long start=System.nanoTime();
int count=(int)Math.pow(10,9);
int x=0;

对于(int i=0;i优化后两者均为空…您如何评估它?而不是
Math.pow(10,9)
,只需为科学记数法编写
1e9
。它是如何编译的?它是如何测试的?代码可能已经过优化,但除非它能够被证明或证明,否则它仍然是推测。我只是单击了在eclipse上运行…@WJSWell,循环中的代码并不是因为cpu能力增加了很多,所以cpu成本不高。所以不是吗这两个方法需要相同的时间:)如果需要,在第一个方法中添加一个线程。sleep()模拟昂贵的执行。你还在猜测。好吧,我改变了主意。你可能是对的。但你没有详细解释原因。与简单循环相比,内部代码更快。这并不能回答这个问题。一旦你有足够的钱,你将能够;相反好的,谢谢你的支持。JIT并没有优化它,这让我感到不可思议。你的意思是不转换为int?我同意。是的,即使
double
可以存储比
int
多得多的值,我不明白为什么不应该只进行简单的检查或其他什么来优化循环。当我检查字节码时,我很惊讶它居然在那里。所有从未在循环外引用的局部值。我喜欢您所做的观察,但我也要明确指出,与差异
double
vs
int
相比,循环体是微不足道的;因为OP就是这么问的。