2012-01-19 40 views
8

X đúng là gần 99,9% thời gian nhưng tôi cũng cần xử lý Y và Z. Mặc dù cơ thể của điều kiện X là trống rỗng, tôi nghĩ rằng nó sẽ nhanh hơn khả năng kiểm tra 2 điều kiện khác Y và Z nếu điều kiện X bị bỏ qua. Bạn nghĩ sao?C/C++ hiệu quả nhất nếu đánh giá câu lệnh

if (likely(X)) 
{ 
} 
else if (unlikely(Y)) 
{ 
... 
} 
else if (unlikely(Z)) 
{ 
... 
} 
+8

Điều gì khiến bạn nghĩ rằng bạn cần phải lo lắng về điều này? –

+0

Câu trả lời tùy thuộc vào logic của bạn. Tình trạng X * luôn luôn * ngụ ý không-Y và không-Z? –

+0

@PaulR vì nó trong một vòng lặp rất rất chặt chẽ. – chriskirk

Trả lời

11

Bạn có thể muốn biết chính xác những gì sẽ xảy ra khi bạn sử dụng khả năng hay không:
http://kerneltrap.org/node/4705

Cá nhân tôi sẽ viết

if (unlikely(!X)) 
{ 
    if (unlikely(Y)) 
    { 
    ... 
    } 
    else if (unlikely(Z)) 
    { 
    ... 
    } 
} 

Có nghĩa là nếu x, tiếp tục thực hiện, khác nhảy để nếu cơ thể.

8

Như thường lệ, khi nghi ngờ hồ sơ; dù sao đi nữa, nếu tôi được đọc mã mà tôi sẽ tìm thấy một cái gì đó rõ ràng hơn nhiều như:

if (!likely(X)) 
{ 
    if (unlikely(Y)) 
    { 
    ... 
    } 
    else if (unlikely(Z)) 
    { 
    ... 
    } 
} 
+1

Tôi không thực sự chắc chắn rằng sự phủ nhận không chắc sẽ hoạt động như mong đợi? Tôi thà viết 'không (! X)'. Điều này có nghĩa rằng sẽ không có nhảy nếu 'x' là sai. – log0

+0

@Ugo Tôi thích giải pháp được đăng bởi Matteo và tôi viết lại nó bằng cách sử dụng (x) không thể thay thế của bạn. – chriskirk

+0

@Ugo: Tôi giả định rằng 'khả năng (X)' là toàn bộ điều kiện được đánh giá, như trong mã giả của nó ... vẫn còn, điểm tôi đang làm nên rõ ràng. –

1

Nếu trình biên dịch giả định, thông thường sẽ ưu tiên điều kiện đầu tiên.

bạn có thể sử dụng một cái gì đó như __builtin_expect để kiểm soát điều này (như Ugo chi tiết).

Nếu trong vòng lặp, bạn nên đo lường vì phần cứng cũng là một xem xét - nó không chỉ là nguồn và trình biên dịch. Bộ nhớ cache của bạn như thế nào và dự đoán nhánh của bạn hoạt động như thế nào? Hồ sơ. Thay đổi. Hồ sơ. So sánh.

0

Bạn có thực sự cần sự cố về y và z không? Nghe có vẻ từ câu hỏi của bạn như thế nào nếu x là không đúng sự thật, sau đó y hoặc z phải đúng, trong trường hợp những nhân chắc là không chính xác và tôi sẽ đi với điều này:

if (unlikely(!X)) 
{ 
    if (Y) 
    { 
    ... 
    } 
    else //Z must be true 
    { 
    ... 
    } 
} 

(có đã thực hiện điều này một bình luận trên Ugo của câu trả lời, nhưng tôi không có đủ tiếng để lại bình luận.)

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