Trên một bộ xử lý hiện đại, rất nhiều điều này đi xuống để dự đoán chi nhánh. Trong khi một tuyên bố chuyển đổi có thể được thực hiện như là một bảng nhảy mà mất khoảng thời gian tương tự để thực hiện bất kỳ chi nhánh của mã, nó cũng thường khá khó đoán - nghĩa đen; một người dự báo chi nhánh thường sẽ làm một công việc khá nghèo nàn về việc dự đoán nhánh nào được thực hiện, có nghĩa là có một cơ hội rất tốt của bong bóng đường ống (thường khoảng 15 chu kỳ lãng phí hoặc hơn).
Một tuyên bố nếu có thể so sánh nhiều hơn, nhưng hầu hết các nhánh có thể được thực hiện theo cùng một cách gần như mọi thời gian, vì vậy dự đoán nhánh có thể dự đoán kết quả chính xác hơn.
Con trỏ đến chức năng cũng có thể không thể đoán trước được. Tệ hơn, cho đến gần đây, hầu hết các bộ vi xử lý khá nhiều thậm chí không thử. Chỉ gần đây gần đây đã bổ sung đủ cho hầu hết các triển khai của BTB (Branch Target Buffer) mà chúng thực sự có thể thực hiện một nỗ lực nghiêm túc trong việc dự đoán mục tiêu của một nhánh thông qua một con trỏ. Trên các bộ vi xử lý cũ hơn, các con trỏ tới các hàm thường làm khá kém so với tốc độ so sánh.
Nguồn
2010-02-19 02:23:17
Có câu hỏi nào ở đây không? Ở mức tối thiểu, bạn sẽ phải hiển thị một số mã. Không có cách nào bạn sẽ đo lường bất kỳ sự khác biệt nào giữa ba trường hợp này với ~ 20 trường hợp ... –
Tôi có thể xác nhận kết quả của bạn. Tôi cũng đã đặt cược vào mảng con trỏ là nhanh nhất. Chỉ cần một lý do khác để sử dụng profiler trước khi bạn làm * any * optimization. – vava
Bạn phải bao gồm khởi tạo thời gian chạy của "mảng con trỏ" trong thử nghiệm thời gian của mình. Điều đó, và trình biên dịch có lẽ tối ưu hóa các cuộc gọi hàm gián tiếp bởi vì bạn đang đặt mọi thứ vào cùng một đơn vị dịch. Bạn không thể thuyết phục tôi rằng bạn có thể đo lường sự khác biệt giữa những điều này với một thử nghiệm ngây thơ của 20 trường hợp! –