Tôi đoán là các gợi ý dự đoán ở cấp độ lệnh máy ít nhất là một tiếng ồn và tệ nhất là sự bất lợi (các byte lệnh lãng phí) đối với kiến trúc thực thi đầu cơ, không theo thứ tự hiện đại. Làm như vậy sẽ giống như bảo CPU ngừng hoạt động - ngừng làm những việc đã thông minh mà nó được thiết kế để thực hiện.
Thứ hai, mức độ dự đoán chi nhánh có thể được cải thiện tùy thuộc vào nguyên nhân dẫn đến sai lầm và mức độ dễ dàng mà người ta có thể đo lường hiệu quả thực hiện hoặc để quan sát xu hướng của chi nhánh.
Tuy nhiên, tôi nghĩ rằng các thủ thuật tối ưu hóa JIT hiện có đã có thể cải thiện dự đoán nhánh ở một mức độ nhất định, ngay cả khi không có sự trợ giúp của các bộ đếm dự đoán sai nhánh CPU.
Chỉ là một ví dụ mã rất đơn giản:
public void repeatHistory(int value)
{
if (value == 1492)
{
landing();
}
else if (value == 1776)
{
ratifying();
}
}
Giả sử repeatHistory
được gọi là rất nhiều lần. Khi trình giám sát hiệu suất dựa trên lấy mẫu phân tích số liệu thống kê ngăn xếp cuộc gọi, có thể thấy rằng, vì bất kỳ lý do gì, repeatHistory()
việc gọi ratifying()
xảy ra thường xuyên hơn so với cuộc gọi trước landing()
. Dựa trên quan sát này, việc truyền mã JIT tiếp theo cho repeatHistory
phương thức sẽ tính đến điều này và thực hiện một hoặc nhiều tối ưu hóa:
- Di chuyển kiểm tra
(value == 1776)
trước kiểm tra cho(value == 1492)
- Cố gắng nội tuyến
ratifying()
phương thức vào chi nhánh trongrepeatHistory()
- Nếu
repeatHistory()
được gọi từ một vòng lặp khác, hãy thử hủy bỏ vòng lặp hoặc đặt repeatHistory()
phương thức vào vòng lặp đó.
- Và nhiều người khác.
Sau khi áp dụng một tối ưu hóa, thường cần phải phân tích lại để xem có thể áp dụng tối ưu hóa nhiều hơn không, bởi vì một tối ưu hóa thường sẽ mở ra nhiều cơ hội hơn.