2013-07-20 46 views
3

看一看this question没有JIT优化

代码:

class test 
{ 
    public static void main(String abc[]) 
    { 
     for(int k=1; k<=3; k++) 
     { 
      for(int N=1; N<=1_000_000_000; N=N*10) 
      { 
       long t1 = System.nanoTime(); 

       int j=1; 
       for(int i=0; i<=N; i++) 
        j=j*i; 

       long t2 = System.nanoTime() - t1; 
       System.out.println("Time taken for "+ N + " : "+ t2); 
      } 
     } 
    } 
} 

以上代码的输出:

Time taken for 1 : 2160 
Time taken for 10 : 1142 
Time taken for 100 : 2651 
Time taken for 1000 : 19453 
Time taken for 10000 : 407754 
Time taken for 100000 : 4648124 
Time taken for 1000000 : 12859417 
Time taken for 10000000 : 13706643 
Time taken for 100000000 : 136928177 
Time taken for 1000000000 : 1368847843 
Time taken for 1 : 264 
Time taken for 10 : 233 
Time taken for 100 : 332 
Time taken for 1000 : 1562 
Time taken for 10000 : 17341 
Time taken for 100000 : 136869 
Time taken for 1000000 : 1366934 
Time taken for 10000000 : 13689017 
Time taken for 100000000 : 136887869 
Time taken for 1000000000 : 1368178175 
Time taken for 1 : 231 
Time taken for 10 : 242 
Time taken for 100 : 328 
Time taken for 1000 : 1551 
Time taken for 10000 : 13854 
Time taken for 100000 : 136850 
Time taken for 1000000 : 1366919 
Time taken for 10000000 : 13692465 
Time taken for 100000000 : 136833634 
Time taken for 1000000000 : 1368862705 

在循环中,即使价值我从0开始,表示产品为零,没有JIT优化。为什么不 ? 在上面提供的链接中,我以前将for循环放在JIT正在优化的方法调用中。是否将这些陈述放在优化过程中的方法中?

+0

这并不觉得自己是一个很现实的问题。你正在做一些无用的事情 - JIT优化对真正的*代码代码真的很重要吗? –

+0

您正在测量的时间以纳秒为单位,因此速度足够快。在这里查看修改后的测试的毫秒数 - http://ideone.com/Xq0xj1 –

回答

5
  1. 在你前面的问题的JIT优化掉的方法start的完整代码没有任何分析,以什么号码正好是存在于在方法的返回变量。这是因为你选择了使你的方法void,给JIT一个简单的线索,任何计算的值都将被丢弃。

  2. 将您当前的示例与上一个问题的示例进行对比,没有void方法调用,所以自然不会发生优化。为什么没有一些其他的优化,这将有助于这个完全不同的情况是一个无法回答的问题。在spencefic JVM实现中没有这样的优化,以及您测试代码的特定JVM调用。

2

环路本身不会获取即时编译(由第二和第三执行的略低运行时间所观察到的),然而消除整个回路是 - AFAIK - 只有当该方法本身执行多次完成,因为只有那时JIT才有足够的运行时信息来确保它实际上可以消除它而没有后果。

如果我改变你的代码,循环被消除在第三次调用:

public class LoopJit2 { 

    public static void main(String abc[]) { 
     for (int x = 0; x < 3; x++) { 
      loopMethod(); 
     } 
    } 

    private static void loopMethod() { 
     for (int N = 1; N <= 1_000_000_000; N = N * 10) { 
      long t1 = System.nanoTime(); 

      int j = 1; 
      for (int i = 0; i <= N; i++) 
       j = j * i; 

      long t2 = System.nanoTime() - t1; 
      System.out.println("Time taken for " + N + " : " + t2); 
     } 
    } 
} 

时间序列:

Time taken for 1 : 1466 
Time taken for 10 : 1467 
Time taken for 100 : 2934 
Time taken for 1000 : 20044 
Time taken for 10000 : 201422 
Time taken for 100000 : 1993200 
Time taken for 1000000 : 4038223 
Time taken for 10000000 : 11182357 
Time taken for 100000000 : 111290192 
Time taken for 1000000000 : 1038002176 
Time taken for 1 : 1466 
Time taken for 10 : 1467 
Time taken for 100 : 2934 
Time taken for 1000 : 20044 
Time taken for 10000 : 10755 
Time taken for 100000 : 124667 
Time taken for 1000000 : 1010045 
Time taken for 10000000 : 10201156 
Time taken for 100000000 : 103184413 
Time taken for 1000000000 : 1019723107 
Time taken for 1 : 978 
Time taken for 10 : 1467 
Time taken for 100 : 1467 
Time taken for 1000 : 1955 
Time taken for 10000 : 978 
Time taken for 100000 : 489 
Time taken for 1000000 : 977 
Time taken for 10000000 : 977 
Time taken for 100000000 : 978 
Time taken for 1000000000 : 978 
+0

根据您的结果,看起来即使原始代码应该已经通过堆栈替换进行了优化。也许它只需要更长的时间? –

+0

@MarkoTopolnik我也尝试了更大的迭代次数的原始代码,我的猜测是它首先需要运行+ jit整个方法至少一次,只有这样才能得出结论:优化它是安全的。 –

+3

我认为以每个方法为基础实现JIT编译器/优化器比在方法内的任意块中尝试这样做更可行。所以这似乎也是一个论点,你应该尝试将功能分解成更小的方法,然后通过其他方法调用。它允许JIT独立地优化每一个。 –