2014-02-09 32 views
1

Groovy是否可能在我的應用程序中每隔一段時間都沒有自動複選框?Groovy在原語上非常慢

下面的代碼...

public class SumTest { 
    public static void main(String[] args) { 
     long[] longs = new long[100000000]; 

     long nanoStart = System.nanoTime(); 
     long counter = 1; 
     for (int i = 0; i < longs.length; i++) { 
      longs[i] = counter++; 
     } 

     double msPop = (System.nanoTime() - nanoStart)/1000000d; 
     System.out.println("Time taken, population: " + msPop + "ms."); 

     nanoStart = System.nanoTime(); 
     long sum = 0; 
     for (int i = 0; i < longs.length; i++) { 
      sum += longs[i]; 
     } 
     double msSum = (System.nanoTime() - nanoStart)/1000000d; 
     System.out.println("Time taken, sum: " + msSum + "ms, total: " + (msPop + msSum) + "ms"); 
     System.out.println(" (sum: " + sum + ")"); 
    } 
} 

...展品截然不同的運行時間從時 '的.java' 更名爲 '.groovy作爲':

的Java:

Time taken, population: 94.793746ms. 
Time taken, sum: 65.172605ms, total: 159.966351ms 
(sum: 5000000050000000) 

Groovy:

Time taken, population: 2233.995965ms. 
Time taken, sum: 2203.64302ms, total: 4437.638985ms 
(sum: 5000000050000000) 

..這是一個約30倍的差異。

的局勢加劇當我堅持長遠目標內(如在我真正的代碼的情況下):

public class SumTest { 
    static class Holder { 
     long l; 
     Holder(long l) { this.l = l; } 
     long getL() { return l; } 
    } 

    public static void main(String[] args) { 
     Holder[] longs = new Holder[100000000]; 

     long nanoStart = System.nanoTime(); 
     long counter = 1; 
     for (int i = 0; i < longs.length; i++) { 
      longs[i] = new Holder(counter++); 
     } 

     double msPop = (System.nanoTime() - nanoStart)/1000000d; 
     System.out.println("Time taken, population: " + msPop + "ms."); 

     nanoStart = System.nanoTime(); 
     long sum = 0; 
     for (int i = 0; i < longs.length; i++) { 
      sum += longs[i].getL(); 
     } 
     double msSum = (System.nanoTime() - nanoStart)/1000000d; 
     System.out.println("Time taken, sum: " + msSum + "ms, total: " + (msPop + msSum) + "ms"); 
     System.out.println(" (sum: " + sum + ")"); 
    } 
} 

運行時間(請注意,我用-Xms16384M -Xmx16384M運行這裏) :

的Java

Time taken, population: 1083.784927ms. 
Time taken, sum: 180.518991ms, total: 1264.3039179999998ms 
(sum: 5000000050000000) 

的Groovy:

Time taken, population: 9816.007447ms. 
Time taken, sum: 8685.506864ms, total: 18501.514311ms 
(sum: 5000000050000000) 

..其總數是~15倍,,但最重要的區別來自實際使用這些對象(由總和表示):〜50x。

這可以以某種方式固定嗎?當涉及操作只有涉及原語和原始操作時,我可以哄Groovy不自動包含涉及原語的每個操作嗎?

回答

2

(哇!真奇怪,徹底地制定一個問題幾乎是立刻就導致一個答案?!)

修復:在類的頂部寫@CompileStatic

Time taken, population: 1562.978726ms. 
Time taken, sum: 183.388353ms, total: 1746.367079ms 
(sum: 5000000050000000) 
+1

'@ CompileStatic'會做你想做的事,但它也做得更多。這意味着你完全繞過了groovy的所有動態特性。這在很多情況下可以帶來很大的性能提升。雖然依賴於動態方法和屬性的語言有很多功能,並且不能用於@CompileStatic。只是FYI。 – allTwentyQuestions