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