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不自动包含涉及原语的每个操作吗?
'@ CompileStatic'会做你想做的事,但它也做得更多。这意味着你完全绕过了groovy的所有动态特性。这在很多情况下可以带来很大的性能提升。虽然依赖于动态方法和属性的语言有很多功能,并且不能用于@CompileStatic。只是FYI。 – allTwentyQuestions