Java method này được sử dụng trong tiêu chuẩn cho mô phỏng tính toán chậm:Tại sao phương pháp này không được tối ưu hóa?
static int slowItDown() {
int result = 0;
for (int i = 1; i <= 1000; i++) {
result += i;
}
return result;
}
Đây là IMHO một ý tưởng rất xấu, như cơ thể của nó có thể được thay thế bởi return 500500
. Điều này dường như không bao giờ xảy ra; có lẽ vì một sự tối ưu hóa như vậy không liên quan đến mã thực như Jon Skeet đã nói.
Thật thú vị, một phương pháp đơn giản hơn một chút với result += 1;
được tối ưu hóa hoàn toàn (báo cáo caliper 0.460543 ns).
Nhưng ngay cả khi chúng tôi đồng ý rằng việc tối ưu hóa đi các phương pháp trả về một kết quả không thay đổi là vô ích cho mã thực, vẫn còn là vòng lặp unrolling, mà có thể dẫn đến một cái gì đó giống như
static int slowItDown() {
int result = 0;
for (int i = 1; i <= 1000; i += 2) {
result += 2 * i + 1;
}
return result;
}
Vì vậy, câu hỏi của tôi vẫn là: Tại sao không tối ưu hóa thực hiện ở đây?
Trái với những gì tôi đã viết ban đầu; Tôi chắc đã thấy thứ gì đó không có ở đó.
Làm sao bạn kiểm tra điều này? Nếu sử dụng JIT, bạn có thể sẽ quan sát những thứ tương tự bằng cách thay đổi mã một chút, vì có rất nhiều sự chẩn đoán liên quan. Bạn không có cách nào đảm bảo cho JIT áp dụng ngay cả những tối ưu hóa đơn giản nhất như nội tuyến vì nó chỉ làm như vậy một khi được coi là cần thiết. –
Đây có phải là mã thực sự không? Nếu bạn biết những gì nó có nghĩa là để trở về, tại sao không chỉ viết mã theo cách đó? Tôi là nội dung mà trình biên dịch JIT được điều chỉnh để tối ưu hóa * thực * mã hơn là tối ưu hóa mã đi mà sẽ không xảy ra trong thực tế. (Tối ưu hóa tĩnh có nhiều hơn một chút so với điều này, nhưng hãy nhớ rằng mỗi tối ưu hóa một trình biên dịch JIT cố gắng tìm thấy có một chi phí tại thời gian thực hiện *.) –
@ JonSkeet: Tôi quan sát, lúng túng, liên kết hướng đến mã chuẩn Guava, Tôi thường hy vọng sẽ tin tưởng ... –