Java 输出定时问题

Java 输出定时问题,java,timing,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("asfasdf

以下代码:

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));
String str1=“asdfavaxzvzxvc”;
字符串str2=“werwerzsfaasdf”;
对象c=str1;
对象d=str2;
系统输出打印ln(c);
长时间1=System.currentTimeMillis();

对于(int i=0;i编译器将进行优化-在本例中,整个循环将被删除。这可能由字节码编译器(例如,
javac
)完成,或者更可能由的完成

为什么执行此操作仍然需要惊人的5毫秒?它不一定需要那么长的时间。相反,您可能在
System.currentTimeMillis()
.FWIW上达到了分辨率限制,在我的Windows系统上使用
nanoTime()
currentTimeMillis()
一致

你可能对阅读和阅读感兴趣

进一步阅读

编译器将优化整个循环,因为它没有明显的副作用。

当Java“编译器”编译代码时,它会对代码进行一些优化。如果删除子句,则为空,因此您只需要长for循环,这非常快

但是,由于“编译器”不知道if总是false,并且子句中的代码从未执行过,所以每次都要测试它。这需要更长的时间。

这很有趣

它不能是编译时优化。编译器不能只删除整个循环体,因为循环中有对
equals()
方法的调用。编译器不能假设该方法没有副作用,并且总是返回相同的结果


但是JIT编译器有可能在运行时进行这些优化。所以这可能就是正在发生的事情。

你能详细说明一下,这是什么样的优化,因为我得到了这么多的时差吗?。你是什么意思,“这是什么样的优化?”这是一个删除死代码的优化。@Peeyush我试图稍微改进你的问题。请尽可能准确地标记你的问题。另外,没有必要澄清标题上的语言,标记就足够了。总之,好问题,+1,但请下次记住这一点!嗯……在我的机器中,代码是above在没有注释和没有注释的情况下运行需要相同的时间。因此,它可能是特定于JVM的?@maks:您使用的JVM是什么?您在调试模式下运行吗?什么VM args?在问题的标题中,您说“问题”为什么这是一个问题?您不应该基于循环进行任何计时。请使用计时器。@Matt Ball:Java HotSpot Client VM。我从netbeans ide运行过它,没有指定任何参数。不,这不是调试模式。