2017-08-21 16 views
7

Tôi đang cố gắng giải thích lý do JIT về các lý do Hotspot. Tôi chủ yếu quan tâm đến giai đoạn biên dịch mới nhất (trình biên dịch C2). JIT trong Java có dựa vào các xác nhận để tối ưu hóa không? Nếu đúng như vậy, tôi có thể tưởng tượng rằng có những ví dụ về mã có thể chạy nhanh hơn với các xác nhận được bật.Java, Assertions và JIT

Ví dụ, trong một đoạn mã như thế này:

static int getSumOfFirstThree(int[] array) { 
    assert(array.length >= 3); 
    return array[0] + array[1] + array[2]; 
} 
  • sẽ JIT, khi khẳng định được kích hoạt, đủ thông minh để loại bỏ các giới hạn kiểm tra trên mảng truy cập?
  • Ngoài ra, có trường hợp nào khác mà bạn có thể nghĩ đến (thực tế hay không), nơi khẳng định sẽ thực sự cải thiện mã gốc mà JIT sẽ biên dịch?

Trả lời

3

Trong trường hợp này, có nhiều kiểm tra ràng buộc được thực hiện và JIT có thể kết hợp chúng để chỉ thực hiện một lần kiểm tra, tuy nhiên xác nhận không tránh được việc kiểm tra.

Các xác nhận ngăn chặn các tối ưu hóa như nội tuyến như phương thức lớn hơn và kích thước là yếu tố quyết định có nên nội tuyến phương thức hay không. Thông thường nội tuyến cải thiện hiệu suất nhưng trong một số trường hợp nó không phải là nó có thể gây ra L0 hoặc L1 CPU lưu trữ để trở thành không hiệu quả do mã lớn hơn được tạo ra.

Ví dụ về nơi xác nhận có thể cải thiện hiệu suất là một cái gì đó như thế này.

boolean assertionOn = false; 
assert assertionOn = true; 
if (assertionOn) { 
    assumeDataIsGood(); // due to checks elsewhere 
} else { 
    expensiveCheckThatDataMightNotBeGood(); 
} 

Đây có lẽ là mô hình chống sử dụng xác nhận, nhưng sẽ rẻ hơn với xác nhận theo mục đích.