2012-08-01 13 views
8

Me preguntaba si hay una gran diferencia de rendimiento en los idiomas, ya sea que debas poner el código más probable para ser ejecutado en el if o en la cláusula else. Este es un ejemplo:Si no, ¿debería poner la parte más probable?

// x is a random number, or some key code from the user 
if(!somespecific_keycode) 
    do the general stuff 
else 
    do specific stuff 

y la otra solución

if(somespecific_keycode) 
    do the specific stuff 
else 
    do general stuff 
+0

Eso depende en gran medida del compilador, la versión del compilador, las opciones de optimización que ha elegido y, a veces sólo el clima. Pero en el 99,999% de todos los casos del mundo real en los que puedo pensar, probablemente no notará ninguna diferencia. –

+0

Habrá una diferencia de rendimiento ... en la escala de ** NANOSECONDS! ** Eso no se notará a nadie excepto a Superman. – Marlon

Respuesta

6

Prefiero ponerlos en el orden que hace que el código sea más claro, que por lo general es más probable que se ejecute primero.

+2

Totalmente compatible con esta respuesta. Buenas organizaciones con elaboradas convenciones de codificación incluirían esto en las reglas –

+0

No estoy de acuerdo. La pregunta es sobre el rendimiento en absoluto. –

1

predicción de bifurcación hará que uno de los que es más probable y que causará una diferencia de rendimiento si dentro de un bucle. Pero, en general, puedes ignorar eso si no estás pensando en el nivel de ensamblador.

3

A menos que experimente un problema de rendimiento, no se preocupe.

Si experimenta un problema de rendimiento, intente cambiarlos y mida cuya variante es más rápida, si la hay.

1

La regla común es poner el caso más probable primero, se considera más legible.

0

En general, no hace la diferencia, pero a veces es más fácil de leer y depurar si su ifs está comprobando si algo es cierto o igual y el resto maneja cuando ese no es el caso.

0

Como han dicho los otros, no va a hacer una gran diferencia a menos que esté usando esto muchas veces (en un ciclo, por ejemplo). En ese caso, coloque primero la condición más probable, ya que tendrá la oportunidad más temprana de salir de la verificación de condición.

Se hace más evidente cuando comienzas a tener muchos 'otros si'.

7

Como han dicho otros: en términos de rendimiento, es mejor que confíe en su compilador y su hardware (predicción de ramificación, ejecución especulativa) para hacer lo correcto.

En caso de que realmente le preocupe que estos dos no le ayuden lo suficiente, GCC proporciona un builtin (__builtin_expect) con el que puede indicar explícitamente el resultado esperado de una sucursal.

En términos de legibilidad del código, personalmente me gusta el caso más probable para estar en la parte superior.

+0

He votado esta respuesta, y sería mejor si explicara cómo usar __builtin_pect y diera un ejemplo. –

+0

que solo cuenta, cuando el compilador sabe cuál es más probable, cuando se trata de la entrada del usuario, el programador sabe cuál es la opción más probable que el usuario elija –

+0

Un ejemplo para __builtin_expect() se puede encontrar en la documentación que he vinculado a. – BjoernD

0

Cualquier diferencia que pueda surgir está más relacionada con el contexto que inherentemente con las construcciones if-else. Entonces, lo mejor que puede hacer aquí es desarrollar sus propias pruebas para detectar cualquier diferencia.

A menos que esté optimizando un sistema o software ya terminado, lo que le recomendaría es evite las optimizaciones prematuras. Probablemente ya hayas escuchado que son malvados.

0

AFAIK con compiladores modernos de optimización de C no existe una relación directa entre la forma en que organiza su if o el bucle y las instrucciones de bifurcación reales en el código generado. Además, diferentes CPU tienen diferentes algoritmos de predicción de bifurcación.

Por lo tanto:

  • no optimizan hasta que vea mal desempeño en relación con este código

  • Si optimizar, medir y comparar diferentes versiones

  • utilizar los datos reales de características variadas para la medición del rendimiento

  • Mirar código de conjunto generar d por tu compilador en ambos casos.

0

Esto no es necesariamente un problema de rendimiento, pero por lo general van desde específico a lo general para prevenir casos como éste:

int i = 15; 

if(i % 3 == 0) 
    System.out.println("fizz"); 
else if(i % 5 == 0) 
    System.out.println("buzz"); 
else if(i % 3 == 0 && i % 5 == 0) 
    System.out.println("fizzbuzz"); 

Aquí el código anterior nunca dirá 'FizzBuzz', porque 15 coincide con las condiciones i % 3 == 0 y i % 5 == 0. Si vuelve a fin en algo más específico:

int i = 15; 

if(i % 3 == 0 && i % 5 == 0) 
    System.out.println("fizzbuzz"); 
else if(i % 3 == 0) 
    System.out.println("fizz"); 
else if(i % 5 == 0) 
    System.out.println("buzz"); 

Ahora el código anterior alcanzará "FizzBuzz" antes de ser detenido por las condiciones más generales

0

Todas las respuestas tienen puntos válidos. Aquí es un adicional:

  • evitar la doble negaciones: si no esto, entonces que, de lo contrario algo tiende a ser confuso para el lector. Por tanto, para el ejemplo dado, yo estaría a favor:

    if (somespecific_keycode) { 
        do_the_specific_stuff(); 
    } else { 
        do_general_stuff(); 
    } 
    
Cuestiones relacionadas