2010-09-10 136 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性能分析產生額外的開銷,這可以 - 在某些情況下顯着 - 改變測試的應用程序的性能行爲。