Đôi khi một vòng lặp mà CPU dành phần lớn thời gian có một số dự đoán chi nhánh bỏ lỡ (misprediction) rất thường xuyên (gần xác suất 0,5.) Tôi đã nhìn thấy một vài kỹ thuật về các chủ đề rất cô lập nhưng không bao giờ là một danh sách. Những cái tôi biết đã sửa chữa các tình huống mà tình trạng có thể được chuyển sang một bool và 0/1 được sử dụng theo một cách nào đó để thay đổi. Có các nhánh có điều kiện khác có thể tránh được không?Bạn cần biết những kỹ thuật nào để tránh phân nhánh có điều kiện?
ví dụ: (Giả)
loop() {
if (in[i] < C)
out[o++] = in[i++]
...
}
có thể được viết lại, cho là mất một số khả năng đọc, với một cái gì đó như thế này:
loop() {
out[o] = in[i] // copy anyway, just don't increment
inc = in[i] < C // increment counters? (0 or 1)
o += inc
i += inc
}
Ngoài ra tôi đã nhìn thấy các kỹ thuật trong tự nhiên thay đổi &&
-&
trong điều kiện trong những bối cảnh nhất định thoát khỏi tâm trí của tôi ngay bây giờ. Tôi là một tân binh ở cấp độ tối ưu hóa này nhưng nó chắc chắn cảm thấy như có được nhiều hơn.
Xấu ví dụ. Ngay cả khi mã không có nhánh có thể được xem là tương đương với mã gốc, đó chỉ là nếu mã ban đầu không có ý nghĩa gì ngay từ đầu. – AnT
Tại sao rất nhiều người trả lời với câu trả lời không thực sự trả lời câu hỏi nằm ngoài tôi – jasonk