2013-08-13 39 views
5
public void zero() { 
    int sum = 0; 
    for (int i = 0; i < mArray.length; ++i) { 
     sum += mArray[i].mSplat; 
    } 
} 

public void one() { 
    int sum = 0; 
    Foo[] localArray = mArray; 
    int len = localArray.length; 

    for (int i = 0; i < len; ++i) { 
     sum += localArray[i].mSplat; 
    } 
} 

Theo Android documentation, ở mã trên, số không là chậm hơn. Nhưng tôi không hiểu tại sao? tôi cũng chưa học được nhiều điều sâu sắc nhưng như tôi biết length là một lĩnh vực không phải là phương pháp. Vì vậy, khi vòng lặp truy xuất giá trị của nó, sự khác biệt của nó khi lấy ra từ biến cục bộ như thế nào? và độ dài mảng luôn cố định khi được khởi tạo. Tôi đang thiếu gì?Câu hỏi về mẹo hiệu suất

+0

Cho đến khi JIT tối ưu hóa mã, ví dụ đầu tiên có nhiều việc phải làm trên mỗi vòng lặp. Khi mã đã được biên dịch, nó phải giống nhau. (Đó là trên OpenJDK) –

Trả lời

8

Tôi đoán điều này là vì tại zero, anh ấy luôn cần truy xuất thông tin từ mArray và trong one, anh ấy có thể truy cập. Điều này có nghĩa, zero cần hai "phương pháp":

  1. Tiếp cận mArray
  2. Tiếp cận mArray.length

Nhưng one chỉ cần một "phương pháp":

  1. Tiếp cận len
2
public void zero() { 
    int sum = 0; 
    for (int i = 0; i < mArray.length; ++i) { 
     sum += mArray[i].mSplat; 
    } 
} 

Ở đây nếu bạn nhìn vào chiều dài mảng vòng lặp được tính cho mỗi lần lặp lại, làm giảm hiệu suất của .

public void one() { 
    int sum = 0; 
    Foo[] localArray = mArray; 
    int len = localArray.length; 

    for (int i = 0; i < len; ++i) { 
     sum += localArray[i].mSplat; 
    } 
} 

Trong trường hợp này, độ dài được tính trước và lặp lại sau đó được sử dụng trong vòng lặp.

3

Trong ví dụ đầu tiên, JVM cần tìm nạp tham chiếu đầu tiên tới mảng và sau đó truy cập trường độ dài của nó.

Trong ví dụ thứ hai, nó chỉ truy cập một biến cục bộ.

On JVM máy tính để bàn này thường được tối ưu hóa và hai phương pháp là tương đương nhưng có vẻ như JVM Android không làm điều đó ... nhưng ...

2

Đó là một vấn đề của phạm vi. Việc truy cập một biến mẫu là chậm hơn một biến phương thức vì nó không được lưu trữ trong cùng một vị trí bộ nhớ. (vì các biến phương thức có thể được truy cập thường xuyên hơn).

Tương tự với len, nhưng với tối ưu hóa thêm. Không thể thay đổi len từ bên ngoài phương thức và trình biên dịch có thể thấy rằng nó sẽ không bao giờ thay đổi. Do đó, giá trị của nó có thể dự đoán được nhiều hơn và vòng lặp có thể được tối ưu hóa thêm.

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