Performance Groovy在基本体上非常慢

Performance Groovy在基本体上非常慢,performance,groovy,primitive,Performance,Groovy,Primitive,在我的应用程序中,是否可以让Groovy而不是auto box在每一个长时间内都运行 下面的代码 public class SumTest { public static void main(String[] args) { long[] longs = new long[100000000]; long nanoStart = System.nanoTime(); long counter = 1; for (int i

在我的应用程序中,是否可以让Groovy而不是auto box在每一个长时间内都运行

下面的代码

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 + ")");
    }
}
Groovy:

Time taken, population: 2233.995965ms.
Time taken, sum: 2203.64302ms, total: 4437.638985ms
 (sum: 5000000050000000)
Time taken, population: 9816.007447ms.
Time taken, sum: 8685.506864ms, total: 18501.514311ms
 (sum: 5000000050000000)
。。这是大约30倍的差异

当我将long粘贴到一个对象中时(就像我的真实代码中的情况一样),情况变得复杂了:

Groovy:

Time taken, population: 2233.995965ms.
Time taken, sum: 2203.64302ms, total: 4437.638985ms
 (sum: 5000000050000000)
Time taken, population: 9816.007447ms.
Time taken, sum: 8685.506864ms, total: 18501.514311ms
 (sum: 5000000050000000)
。。总的来说大约快15倍,但最重要的区别在于这些对象的实际使用(用求和表示):~50倍。

这能以某种方式解决吗?当所讨论的操作只涉及原语和原语操作时,我能不能劝说Groovy不要对涉及原语的每一个操作进行自动装箱?

(哇!奇怪的是,一个问题的表述如此彻底,几乎可以立即得到答案?!)

Fix:在类的顶部编写
@CompileStatic

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

@CompileStatic
将执行您希望它执行的操作,但它还可以执行更多操作。这意味着您完全绕过了groovy的所有动态特性。在许多情况下,这可以大大提高性能。但是,该语言有许多功能依赖于动态方法和属性,不能与@CompileStatic一起使用。仅供参考。
Time taken, population: 1562.978726ms.
Time taken, sum: 183.388353ms, total: 1746.367079ms
 (sum: 5000000050000000)