2012-02-13 23 views
14

Esto puede sonar como una pregunta tonta, y dudé en publicarlo, pero aún así: si algo necesita ejecutarse solo en cierta condición, cuál de estos es más eficiente :if-> return vs. if-> else efficiency

A.

if (condition) { 
    // do 
    // things... 
} 

B.

if (!condition) { return; } 
// do 
// things... 
+1

¿Has medido esto? ¿Qué descubriste? – Steven

+8

Es una cosa de estilo. El rendimiento no es relevante; ambos producen código de máquina casi idéntico. Si desea evitar la "programación horizontal", es posible que desee preferir B para evitar las condiciones anidadas. –

+0

Consulte http://jsperf.com/ cuando tenga preguntas como esta. Sitio muy útil! – mrtsherman

Respuesta

6

La ques reales es. ¿De verdad te importa?

¡Digo NO! Es más importante tener un código mejor legible que hacer una micro optimización.

9

Seleccione la cosa que sea más legible. Las optimizaciones de rendimiento en este nivel casi nunca son un problema. Incluso las partes realmente sensibles al rendimiento de los marcos (como .NET framework) no se benefician de una micro optimización de este tipo.

12

Son igual de eficientes, pero B generalmente se considera que proporcionan una mejor legibilidad, especialmente cuando se usan para eliminar varias condiciones anidadas.

2

Aunque estoy de acuerdo en que debe elegir primero la legibilidad, continuaré y agregaré una pequeña información: En C#, no hay diferencia. Se compila para lo mismo (cuando se optimiza construyendo el modo Release). ¿Otros idiomas? Quién sabe, estoy seguro de que algunos de ellos lo consideran diferente, pero las posibilidades de que realmente deba preocuparse por ello son prácticamente nulas.

4

Es una cosa de estilo. El rendimiento no es relevante; ambos producen código de máquina casi idéntico.

Algunas consideraciones sobre el estilo:

Si se quiere evitar la 'programación horizontal', es posible que desee a preferir B para evitar condiciones anidadas. Por ejemplo, si desea agregar excepciones sin afectar el flujo del método demasiado:

Un:

public String getDescription(MyObject obj) { 
    if (obj == null) { 
     return ""; 
    } else { 
     if (!obj.isValid()) { 
      return "invalid"; 
     } else { 
      ... 
     } 
    } 
} 

B:

public String getDescription(MyObject obj) { 
    if (obj == null) { 
     return ""; 
    } 

    if (!obj.isValid()) { 
     return "invalid"; 
    } 

    .... 
} 

Pero la diferencia es mínima si me preguntas. Definitivamente no vale la pena una "guerra de estilo de código".