输出时序问题

pee*_*ush 9 java timing

以下代码:

String str1="asdfavaxzvzxvc";
String str2="werwerzsfaasdf";
Object c=str1;
Object d=str2;
System.out.println(c);
long time1=System.currentTimeMillis();
for(int i=0;i<1000000000;i++){
    if(c.equals(d)){
        //System.out.println("asfasdfasdf"); // line 9
    }
}
long time2=System.currentTimeMillis();
System.out.println("time taken in this is "+(time2-time1));
Run Code Online (Sandbox Code Playgroud)

当我取消对第9行的注释时,如果条件为真则打印,但是由于两个对象不相等都不会发生,所以它需要5000+毫秒,令我惊讶的是只需注释它只需要5毫秒,我没有理由,为什么它需要这么多时间,如果没有评论,因为它永远不会被执行...

这是某种分支预测效果吗?或任何类型的编译器优化

Mat*_*all 12

编译器优化掉死代码 - 在这种情况下,整个循环被删除.这可能是由字节码编译器(例如javac)完成的,或者更有可能是由 HotSpotJIT完成的.

为什么执行这个还需要5毫秒?它并不一定需要那么久.相反,您可能会达到分辨率限制System.currentTimeMillis().试试吧System.nanoTime().FWIW,在我的Windows系统上使用nanoTime()同意currentTimeMillis().

您可能对阅读感兴趣如何在Java中编写正确的微基准测试?并且是秒表标杆接受吗?

进一步阅读


Oli*_*rth 8

编译器将优化整个循环,因为它没有可观察到的副作用.