2012-01-19 7 views
8

X è vero quasi il 99,9% delle volte, ma ho bisogno di gestire anche Y e Z. Sebbene il corpo della condizione X sia vuoto, penso che dovrebbe essere più veloce di potenzialmente controllare le altre 2 condizioni Y e Z se la condizione X è omessa. Cosa ne pensi?C/C++ più efficiente se valutazione dell'istruzione

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

Cosa ti fa pensare che devi preoccuparti di questo? –

+0

La risposta dipende dalla tua logica. La condizione X * sempre * implica non-Y e non-Z? –

+0

@PaulR perché è in un ciclo molto stretto. – chriskirk

risposta

11

Si potrebbe desiderare di sapere cosa succede esattamente quando si utilizza probabile o improbabile:
http://kerneltrap.org/node/4705

Io personalmente scrivere

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

Il che significa che se x, continuare l'esecuzione, altrimenti salto a se il corpo.

8

Come al solito, in caso di dubbio profilo; in ogni caso, se dovessi leggere che il codice avrei trovato molto più chiaro qualcosa di simile:

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

Non sono davvero sicuro che la negazione di improbabile funzionerà come previsto ?? Preferirei scrivere 'improbabile (! X)'. Ciò significa che non ci sarà alcun salto se 'x' è falso. – log0

+0

@Ugo Mi piace la soluzione postata da Matteo e l'ho riscritta usando il tuo improbabile (! X). – chriskirk

+0

@Ugo: ho pensato che "probabile (X)" fosse l'intera condizione da valutare, come nel suo pseudocodice ... comunque, il punto che sto facendo dovrebbe essere chiaro. –

1

Se un compilatore deve assumere, generalmente preferirebbe la prima condizione vera.

è possibile utilizzare qualcosa come __builtin_expect per controllare questo (come Ugo dettagliato).

Se è in un ciclo, è necessario misurare perché anche l'hardware è una considerazione: non è solo la fonte e il compilatore. Com'è la tua cache e come funziona la previsione delle filiali? Profilo. Alter. Profilo. Confrontare.

0

Hai davvero bisogno dell'improbabile su y e z? Suona dal vostro domanda come se x non è vero, allora Y o Z deve essere vera, in questo caso quelle di improbabili non sono corrette e vorrei andare con questo:

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

(ne avrebbe fatto un commento su Ugo di rispondi, ma non ho abbastanza reputazione per lasciare commenti.)