积分为何缓慢

时间:2010-09-10 22:20:57

标签: java awt

我需要传递x / y。我刚刚使用java.awt.Point。考虑到这是应用程序的本质,我做了很多,但比普通数组慢了很多。我也尝试创建自己的“FastPoint”,这只是一个int x / y和非常简单的类构造函数,这也很慢。

时间以毫秒为单位。

java.awt.Point:10374
FastPoint:10032
数组:1210

public class FastPoint {  

    public int x;  
    public int y;  

    public FastPoint(int x, int y) {  
            this.x = x;  
            this.y = y;  
    }
}

Jvisualvm说,与简单的int []数组相比,Point(无论是awt还是我自己)使用大量内存。

我想这只是开始创建一个对象而不是一个基本类型的开销?有没有什么方法可以调整或优化这个Point类?我已经切换到基本的int数组(现在速度更快),但只是试图理解为什么这很慢,如果有什么我可以做的呢?

测试代码:

for (int i = 0; i < maxRuns; i++) { 
    point = new Point(i,i); 
}

for (int i = 0; i < maxRuns; i++) { 
    a[0] = i; a[1] = i; 
}

1 个答案:

答案 0 :(得分:9)

您的测试工具存在偏差:您在每次迭代中创建一个新点,但只创建一次数组。如果将数组分配移动到循环中,差异不会那么大,并且数组实际上稍慢:

点:19纳秒/迭代

阵列:47纳秒/迭代

这是预期的,因为数组访问需要执行边界检查,但字段赋值不需要(JIT显然已经内联了点构造函数)。

另请注意,检测虚拟机以进行cpu性能分析会产生额外的开销,这在某些情况下会极大地改变测试中应用程序的性能行为。