Pregunta

Estoy trabajando en un proyecto que requiere un procesamiento JavaScript bastante complejo. Esto incluye muchos if - else s anidados en bastantes lugares. En general, me he ocupado de optimizar el código JavaScript tanto como sea posible al leer los otros consejos sobre Stack & nbsp; Overflow, pero me pregunto si las siguientes dos construcciones harían alguna diferencia solo en términos de velocidad:

if(some_condition) {
    // process
    return ;
}

// Continue the else condition here

vs

if(some_condition) {
    // Process
}

else {
   // The 'else' condition...
}
¿Fue útil?

Solución

Siempre voy con 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 esperaría que ambos sean idénticos.

Otros consejos

En muchos idiomas, es una práctica común invertir if declaraciones para reducir la anidación o use condiciones previas .

Y tener menos anidamiento en su código mejora la legibilidad y facilidad de mantenimiento del código.

" Perfil, ¡no especules! "

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

    • deberías cronometrar la ejecución tú mismo; obviamente diferirá en diferentes navegadores y versiones
    • solo debe optimizar la velocidad de los puntos de acceso de su aplicación (consulte el punto 1)

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

Usaré el primer enfoque al descartar situaciones inválidas.

Ej. use el primer enfoque cuando realice algunas validaciones y regrese si alguna de las validaciones falla. No tiene sentido ir más allá si alguna de las condiciones previas falla. Martin Fowler menciona lo mismo en su Refactoring libro. É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    
}

Tal vez un poco, pero no creo que sea medible a menos que el resto de la función implique "pesado" (y de lo contrario redundante ya que supongo que una devolución daría el mismo resultado) js llama.

Como nota al margen, creo que esta es una micro optimización innecesaria, y probablemente debería buscar mejoras en el rendimiento, es decir, perfile el script a través de las herramientas de desarrollador de Chrome o Firebug para Firefox (o herramientas similares) y busque un funcionamiento lento / largo llamadas / funciones.

Si bien 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 ensamblaje, la instrucción de salto (micro operación) siempre se evalúa independientemente de la evaluación.

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

Entiendo que eso no haría una diferencia porque se ramifica con la condición if. Entonces, si some_condition es verdadero, la parte else no se tocará, incluso sin el retorno.

Suponga que el return tarda 1 ms en comparación con el anidado si tarda 0.1ms (o viceversa).

Es difícil imaginar que cualquiera de ellos sea tan lento.

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

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

Cuando solo hay un if..else el rendimiento es casi el mismo y no importa. Use lo que sea mejor legible en su caso. Pero llegar a declaraciones anidadas usando return es la most performant en comparación con if ... else y case switch

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

  1. if .. return está bien y es fácil de leer si verifica alguna condición booleana (quizás configuración) que haría innecesario ejecutar todo el siguiente código.

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

En mi opinión, return y else 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 ámbito actual al ámbito primario, mientras que en el caso de if-else puede verificar si if-else más en el mismo ámbito.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top