Tôi đã xem xét một số bộ sưu tập nguyên thủy java (trove, fastutil, hppc) và tôi đã nhận thấy một mẫu mà các biến lớp đôi khi được khai báo là final
biến cục bộ. Ví dụ:Có thể truy cập các biến cục bộ cuối cùng nhanh hơn các biến lớp trong Java không?
public void forEach(IntIntProcedure p) {
final boolean[] used = this.used;
final int[] key = this.key;
final int[] value = this.value;
for (int i = 0; i < used.length; i++) {
if (used[i]) {
p.apply(key[i],value[i]);
}
}
}
tôi đã thực hiện một số điểm chuẩn, và có vẻ như nó là hơi nhanh hơn khi làm điều này, nhưng tại sao đây là trường hợp? Tôi đang cố gắng hiểu Java sẽ làm gì khác nếu ba dòng đầu tiên của hàm được nhận xét.
Lưu ý: Điều này có vẻ tương tự như this question, nhưng đó là cho C++ và không giải quyết tại sao chúng được khai báo final
.
bạn có thể thử xem xét lắp ráp java được tạo để thấy sự khác biệt. –
chỉ nhận ra rằng lý do có thể trong trình biên dịch HotSpot, không phải mã byte ... –
Vui lòng đăng mã điểm chuẩn của bạn, có ít nhất một số cơ hội bạn đã đánh giá sai phương pháp và thực sự chỉ kiểm tra trình thông dịch chứ không phải trình biên dịch :) – Voo