2012-01-19 12 views
8

X es cierto casi el 99.9% del tiempo, pero también necesito manejar Y y Z. Aunque el cuerpo de la condición X está vacío, creo que debería ser más rápido que potencialmente verificar otras 2 condiciones Y y Z si se omite la condición X. ¿Qué piensas?C/C++ más eficiente si evaluación de declaración

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

¿Qué le hace pensar que tiene que preocuparse por esto? –

+0

La respuesta depende de tu lógica. ¿La condición X * siempre * implica no-Y y no-Z? –

+0

@PaulR porque está en un bucle muy cerrado. – chriskirk

Respuesta

11

Es posible que desee saber qué es exactamente lo que sucede cuando se utiliza probable o improbable:
http://kerneltrap.org/node/4705

personalmente me gustaría escribir

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

que significa que si x, continuar la ejecución, de lo contrario salto a si el cuerpo.

8

Como de costumbre, en caso de duda; De todos modos, si tuviera que leer ese código que iba a encontrar mucho más claro algo como:

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

¿No estoy seguro de que la negación de lo improbable funcionará como se espera? Prefiero escribir 'improbable (! X)'. Esto significa que no habrá salto si 'x' es falso. – log0

+0

@Ugo Me gusta la solución publicada por Matteo y la reescribí utilizando su improbable (! X). – chriskirk

+0

@Ugo: Supuse que 'likely (X)' era la condición completa para ser evaluada, como en su pseudocódigo ... aún así, el punto que estoy haciendo debería ser claro. –

1

Si un compilador debe suponer, generalmente favorecería la primera condición verdadera.

puedes usar algo como __builtin_expect para controlar esto (como se detalla en Ugo).

Si está en un bucle, debe medir porque el hardware también es una consideración, no es solo la fuente y el compilador. ¿Cómo funciona tu caché y cómo está funcionando la predicción de ramas? Perfil. Alterar. Perfil. Comparar.

0

¿Realmente necesita lo poco probable en yy z? Suena de su pregunta como si x no es cierto, entonces Y o Z debe ser verdadera, en cuyo caso los de improbables son incorrectos y que irían con esto:

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

(habría hecho de este un comentario sobre Ugo de responda, pero no tengo suficiente reputación para dejar comentarios.)

Cuestiones relacionadas