2010-09-10 133 views
5

我需要绕过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说点(或者AWT或我自己的)使用吨存储器相比简单INT []阵列。

我想这只是从创建一个对象而不是一个基本类型的开销?任何方式来调整或优化这个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

我不相信使用数组而不是对象会导致900%的时间增加。时间以毫秒为单位 - >但要做什么? – 2010-09-10 22:26:34

+0

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; } dime 2010-09-10 22:35:24

+1

也是,在你的阵列版本,你不是** **实例化的阵列。创建对象/数组和在同一数组中分配值*到*元素的成本差异很大* *。 – 2010-09-10 22:38:18

回答

9

你的测试工具是偏颇:您可以创建在每次迭代中一个新的起点,但创建阵列一次。如果移动数组分配到回路,所不同的是不一样大,和数组实际上稍微慢:

点:19纳秒/迭代

阵列:47纳秒/迭代

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

还要注意的是插装虚拟机的CPU性能分析产生额外的开销,这可以 - 在某些情况下显着 - 改变测试的应用程序的性能行为。