积分为何缓慢

dim*_*ime 5 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;  
    }
}
Run Code Online (Sandbox Code Playgroud)

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; 
}
Run Code Online (Sandbox Code Playgroud)

mer*_*ike 9

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

点:19纳秒/迭代

阵列:47纳秒/迭代

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

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