【问题标题】:Why are Points slow为什么积分慢
【发布时间】:2010-09-11 07:00:50
【问题描述】:

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

时间以毫秒为单位。

java.awt.Point: 10374
快速点: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; 
}

【问题讨论】:

  • 我不相信使用数组代替对象会导致 900% 的时间增加。以毫秒为单位的时间 -> 但要做什么?
  • for (int i = 0; i for (int i = 0; i
  • 另外,在您的数组版本中,您没有实例化数组。创建对象/数组和为同一数组中的元素赋值之间的成本差异是vast

标签: java awt


【解决方案1】:

您的测试工具有偏差:您在每次迭代中创建一个新点,但只创建一次数组。如果把数组分配移到循环里面,差别就没有那么大了,数组其实稍微慢一些:

点:19 纳秒/迭代

数组:47 纳秒/迭代

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-08
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2023-01-16
    • 2013-01-01
    相关资源
    最近更新 更多