2010-09-10 37 views
5

Tôi cần phải vượt qua một x/y xung quanh. Tôi chỉ sử dụng java.awt.Point. Tôi làm điều này rất nhiều xem xét nó là bản chất của ứng dụng, nhưng tấn chậm hơn sau đó mảng bình thường. Tôi cũng đã cố gắng tạo ra "FastPoint" của riêng tôi, đó chỉ là một hàm tạo lớp int/y và rất đơn giản, nó cũng thực sự rất chậm.Tại sao các điểm chậm lại

Thời gian bằng millescond.

java.awt.Point: 10.374
FastPoint: 10.032
Mảng: 1210

public class FastPoint { 

    public int x; 
    public int y; 

    public FastPoint(int x, int y) { 
      this.x = x; 
      this.y = y; 
    } 
} 

Jvisualvm nói Point (hoặc AWT hoặc của riêng tôi) đang sử dụng tấn bộ nhớ so với int [] mảng đơn giản .

Tôi đoán đó chỉ là chi phí từ việc phải tạo đối tượng thay vì một loại um, cơ bản? Bất kỳ cách nào để tinh chỉnh hoặc tối ưu hóa lớp Point này? Tôi đã chuyển sang mảng int cơ bản (nhanh hơn bây giờ), nhưng chỉ cố gắng hiểu tại sao điều này là chậm và nếu có bất cứ điều gì tôi có thể làm về nó?

Mã kiểm tra:

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

Tôi không tin rằng việc sử dụng mảng thay vì Đối tượng sẽ dẫn đến tăng thời gian 900%. Thời gian trong ms -> nhưng để làm gì? –

+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

+1

cũng vậy, trong phiên bản mảng của bạn, bạn không được ** instantiating ** mảng. Sự khác nhau về chi phí giữa việc tạo các đối tượng/mảng và gán các giá trị * cho * các phần tử trong cùng một mảng là * rộng lớn *. –

Trả lời

9

khai thác thử nghiệm của bạn là thiên vị: Bạn tạo một điểm mới trong mỗi lần lặp, nhưng tạo mảng chỉ một lần. Nếu bạn di chuyển phân bổ mảng vào vòng lặp, sự khác biệt không phải là lớn, và mảng thực sự hơi chậm:

Point: 19 nano giây/lần lặp

Array: 47 nano giây/lần lặp

Điều này đúng như mong đợi, vì các truy cập mảng cần thực hiện kiểm tra giới hạn, nhưng việc gán trường không (JIT rõ ràng đã phác thảo hàm tạo điểm). Cũng cần lưu ý rằng việc thiết lập một máy ảo cho cấu hình cpu sẽ phát sinh thêm chi phí, trong đó có thể - trong một số trường hợp quyết liệt - thay đổi hành vi hoạt động của ứng dụng đang được kiểm tra.

Các vấn đề liên quan