2012-01-15 48 views
6

Tôi nhớ đọc trực tuyến ở một nơi nào đó trong các tình huống độ trễ thấp HẤP DẪN tốt hơn để sử dụng các chức năng ảo làm thay thế cho các câu lệnh IF.Sử dụng các hàm ảo thay vì câu lệnh IF nhanh hơn?

Điều này có đúng không? Họ về cơ bản nói rằng đa hình năng động là tốt hơn cho các tình huống tốc độ?

Mọi người dùng có bất kỳ độ trễ thấp C++ nào khác mà họ có thể chia sẻ không?

+1

Tôi nghĩ rằng nó phụ thuộc vào một loạt các yếu tố - bao gồm ít nhất có bao nhiêu 'if' được xếp chồng lên nhau. Hãy xem xét trường hợp của trình biên dịch và [Mẫu khách truy cập] (http://en.wikipedia.org/wiki/Visitor_pattern) cho mỗi nút trong AST. Tất nhiên, bằng cách sử dụng các mẫu như vậy có thể dẫn đến các đặc tính ít hấp dẫn khác như lan truyền mã trên một loạt các lớp. –

+5

Giống như một lốp xe tốt, bạn cần một điều trên tất cả: Hồ sơ, hồ sơ, hồ sơ. –

+0

Tôi nghĩ rằng điều này sẽ phụ thuộc nhiều vào mã chính xác và câu trả lời thực sự duy nhất là thời gian một vài tỷ lần và xem sự khác biệt là gì. –

Trả lời

7

Tôi rất nghi ngờ rằng một câu lệnh if/else sẽ chậm hơn so với sử dụng hàm ảo: hàm ảo thường thực thi một gian hàng đường ống và giới hạn các cơ hội tối ưu hóa. Một câu lệnh if có thể ngăn chặn đường dẫn nhưng nếu nó thường được thực thi thì dự đoán có thể đi đúng hướng. Tuy nhiên, nếu sự thay thế của bạn nằm giữa một tầng của một vài câu lệnh if/else so với chỉ một cuộc gọi hàm ảo thì nó có thể nhanh hơn. Ngoài ra, nếu tổng số mã đang được thực thi thông qua việc sử dụng các hàm ảo so với các nhánh thì các hàm khác nhau sẽ kết thúc nhỏ hơn đáng kể, nó có thể gây ra một số lỗi cache trên bộ nhớ cache lệnh. Đó là, nó phụ thuộc vào tình hình. Cách tốt nhất là đo lường. Lưu ý rằng việc đo mã nhân tạo chỉ cố gắng điều tra sự khác biệt giữa hai cách tiếp cận nhưng không thực sự xử lý bất kỳ kết quả gây hiểu nhầm nào. Tuy nhiên, khi bạn cần tạo mã độ trễ rất thấp, bạn thường có thể dành nhiều thời gian hơn để tìm ra nó, tức là thử nghiệm với nhiều cách tiếp cận khác nhau có thể tồn tại.

Mặc dù đồng nghiệp của tôi có xu hướng cau mày khi mẫu của tôi tiếp cận để tránh phân nhánh thời gian chạy, mã tôi kết thúc thường rất chậm để biên dịch nhưng rất nhanh để chạy. Tất nhiên, điều này phụ thuộc vào các chức năng hoặc các chi nhánh đang được sử dụng để được biết đến tại thời gian biên dịch. Trong các lĩnh vực tôi đã sử dụng, ví dụ: để xử lý tin nhắn, thường đủ để có một quyết định động, ví dụ: một cho mỗi thông báo (tức là một cuộc gọi hàm ảo), tiếp theo là xử lý không liên quan đến bất kỳ loại động nào (đây vẫn là điều kiện, ví dụ: cho số lượng giá trị trong bảng).

+0

Lưu ý một số bộ xử lý cũng cố gắng dự đoán các nhánh gián tiếp (gia đình AMD 15H có một bảng mục 512 cho ví dụ đó), tăng tầm quan trọng của lời khuyên "đo lường và đo lường trong ngữ cảnh". – AProgrammer

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