我需要传递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;
}
答案 0 :(得分:9)
您的测试工具存在偏差:您在每次迭代中创建一个新点,但只创建一次数组。如果将数组分配移动到循环中,差异不会那么大,并且数组实际上稍慢:
点:19纳秒/迭代
阵列:47纳秒/迭代
这是预期的,因为数组访问需要执行边界检查,但字段赋值不需要(JIT显然已经内联了点构造函数)。
另请注意,检测虚拟机以进行cpu性能分析会产生额外的开销,这在某些情况下会极大地改变测试中应用程序的性能行为。