2010-02-19 31 views
5

Tôi đang xây dựng một phiên dịch viên nhỏ, vì vậy tôi muốn kiểm tra xem các biến số nhanh, chuyển đổi và con trỏ đến các hàm có được so sánh với nhau hay không. nếu với 19 ifs khác là hơi nhanh hơn so với chuyển đổi với 20 trường hợp, và con trỏ chức năng (một mảng 20 con trỏ chức năng) là cách chậm hơn so với trước đó hai ...nếu, công tắc và con trỏ hàm so sánh tốc độ

Tôi mong đợi kết quả hoàn toàn ngược lại, bất cứ ai có thể vui lòng giải thích?

+4

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 ... –

+0

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

+0

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! –

Trả lời

12

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.

+0

Nhưng một lần nữa tôi đã quá chậm :-) +1 – MartinStettner

+0

Làm thế nào để bạn thậm chí đặt con trỏ hàm vào cùng một lớp như phân nhánh? Họ hoàn toàn không liên quan. Bạn vẫn phải có một số loại phân nhánh logic để gán con trỏ hàm ... –

+1

@STingRaySC: Một trường hợp điển hình là một mảng con trỏ tới các hàm, trong đó giá trị tương tự bạn đã sử dụng trong câu lệnh switch thay vào đó được sử dụng để lập chỉ mục vào mảng. –

Các vấn đề liên quan