2009-11-30 13 views
18

Estoy trabajando en un proyecto que requiere un procesamiento bastante complejo de JavaScript. Esto incluye una gran cantidad de if - else s anidados en bastantes lugares. He tomado generalmente la atención a optimizar el código JavaScript en lo posible mediante la lectura de los otros consejos sobre Pila   desbordamiento, pero estoy preguntando si las siguientes dos construcciones haría ninguna diferencia en términos de velocidad solo:Usando 'return' en lugar de 'else' en JavaScript

if(some_condition) { 
    // process 
    return ; 
} 

// Continue the else condition here 

vs

if(some_condition) { 
    // Process 
} 

else { 
    // The 'else' condition... 
} 

Respuesta

15

Siempre uso el primer método. Más fácil de leer y menos sangría. En cuanto a la velocidad de ejecución, esto dependerá de la implementación, pero espero que ambos sean idénticos.

+8

No estoy de acuerdo. Tal vez un poco más fácil de leer, pero más difícil de mantener, incluso más difícil cuando no eres tú, sino cualquier otro desarrollador que tiene que entender el código. Esa es mi opinión, en términos generales, sobre las funciones que tienen demasiados puntos de "retorno". –

+8

Estoy respetuosamente en desacuerdo con su desacuerdo. En mi experiencia, el uso de este tipo de constructo nunca ha afectado la capacidad de mantenimiento. En todo caso, lo ha mejorado; la menor cantidad de declaraciones anidadas tiende a aumentar la capacidad de mantenimiento para mí. Sin embargo, estoy de acuerdo con su comentario sobre tener demasiados "puntos de retorno".En general, solo tengo puntos de retorno al principio y al final de las funciones. Al principio para las exclusiones obvias, y al final para servir al propósito de la función. –

+6

Hay mérito en ambos lados. Mi experiencia personal es que demasiados si-elses anidados es una pesadilla, especialmente si una de las dos condiciones es muy corta y, por lo tanto, podemos hacer una declaración de devolución para terminarla rápidamente. Esto definitivamente lo hace más legible. – jeffreyveon

0

Pruébelo usted mismo. Si este JavaScript se ejecuta en el navegador, seguramente dependerá del motor de análisis de JavaScript del navegador.

0

Según entiendo, no marcaría la diferencia porque se bifurca con la condición if. Por lo tanto, si alguna condición es verdadera, la porción else no se tocará, incluso sin la devolución.

+1

¿Tiene números para confirmar esta afirmación? Recuerde que javascript generalmente no se compila. –

2

No habrá ninguna diferencia en el rendimiento. Recomendaría el segundo ejemplo para la mantenibilidad. En general, es una buena práctica tener un solo punto de salida posible para una rutina. Ayuda a la depuración y la comprensión.

4

"¡Perfil, no especule!"

  1. que está poniendo el carro delante del caballo (capacidad de mantenimiento por los seres humanos triunfos velocidad de la máquina)
  2. debe conducir sus esfuerzos de optimización por mediciones, lo que significa

    • debe momento en que el ejecución usted mismo; que va obviamente difieren en diferentes navegadores y versiones
    • sólo se debe optimizar para la velocidad de los puntos de acceso de su aplicación (véase el punto 1)
1

Tal vez un poco, pero no creo que será medible a menos que el resto de la función involucre "pesado" (y de otra manera redundante ya que supongo que una devolución daría el mismo resultado) js llamadas. Como nota al margen, creo que es una micro optimización innecesaria, y probablemente deberías buscar mejoras en el rendimiento, es decir, perfilar el script mediante las herramientas de desarrollador de Chrome o Firebug for Firefox (o herramientas similares) y buscar lento/largo ejecutar llamadas/funciones.

1

Aunque depende de la implementación de JavaScript del navegador en ejecución, no debería haber ninguna diferencia notable entre ellos (en términos de velocidad).

La segunda forma es preferible ya que romper el flujo no es un buen hábito de programación. También piense en eso en el montaje, la instrucción de salto (microoperación) siempre se evalúa independientemente de la evaluación.

+2

Cita necesaria (para "no es un buen hábito de programación")! :-) Es una cuestión de opinión si es mejor anidar si es necesario o regresar temprano; no hay un ganador definitivo al igual que las pestañas vs espacios, vi vs emacs, etc. Personalmente creo que * es * mejor regresar temprano (como en la primera forma) pero reconozco que las opiniones serán diferentes. –

+0

Tiene razón "no hay un ganador definitivo", pero está lejos de ser "vi" frente a "emacs"; es más como "irrupción for loop" vs "while loop" o "continuar en while/for loop" contra "an outer if block". Yo siempre prefiero los segundos. –

0

Supongamos que el return toma 1 ms frente al if anidado que toma 0.1ms (o viceversa).

Es difícil imaginar que una sea tan lenta.

Ahora, ¿lo estás haciendo más de 100 veces por segundo?

Si es así, tal vez que debería importarle.

+0

Sí, se llama muchas veces. ¡O bien, sé que apenas hace la diferencia! – jeffreyveon

2

Utilizaré el primer enfoque al descartar las situaciones no válidas.

Por ejemplo. utilice el primer enfoque cuando realice algunas validaciones y devuelva si falla alguna de las validaciones. No tiene sentido ir más allá si falla alguna de las condiciones previas. Lo mismo es mencionado por Martin Fowler en su libro Refactoring. Él lo llama "Reemplazar las condiciones con cláusulas de Guardia". Y realmente puede hacer que el código sea fácil de entender.

Aquí hay un ejemplo de Java.

public void debitAccount(Account account, BigDecimal amount) { 
    if(account.user == getCurrentUser()) { 
     if(account.balance > amount) { 
      account.balance = account.balance - amount 
     } else { 
      //return or throw exception 
     } 
    } else { 
     //return or throw exception 
    } 
    } 

VS

public void debitAccount(Account account, BigDecimal amount) { 
    if(account.user != getCurrentUser()) return //or error 
    if(account.balance < amount) return //or error 
    account.balance = account.balance - amount  
} 
0

Hablar de mis experiencias depende de la condición que está comprobando.

  1. if .. return es fina y fácil de leer si comprueba alguna condición booleana (tal vez la configuración) que haría que todo el siguiente código innecesario para ser ejecutado en absoluto.

  2. if .. else es mucho más fácil de leer si espera que algún valor sea de dos (o más) valores posibles y desea ejecutar código diferente para ambos casos. Lo que significa que los dos valores posibles representan condiciones de igual valor interpretable y, por lo tanto, deben escribirse en el mismo nivel lógico.

0

En mi opinión, retorno y lo demás es igual para el caso anterior pero en general if-else y if()return; son muy diferentes. Puede usar la declaración de devolución cuando desee pasar del alcance actual al alcance principal, mientras que en el caso de if-else puede verificar si hay más en el mismo ámbito.

Cuestiones relacionadas