2012-01-26 5 views
15

Compare:Costo de la llamada a una función o no en Javascript

if (myVariable) { 
    doSomething() 
} 

function doSomething() 
{ 
    // Work goes here 
} 

vs

doSomething(); 

function doSomething() 
{ 
    if (myVariable) { 
     // Work goes here 
    } 
} 

es decir, Mi pregunta es si es más rápido para hacer el registro de entrada fuera de la función y evitar un cambio de contexto (Creo que ese es el término correcto)) o simplemente hacerlo dentro de la función porque hace una diferencia tan pequeña?

aplausos.

+0

¡Gran pregunta! Si myVariable no está siempre disponible, el segundo ejemplo solo funcionará si le da la variable como argumento a la función, no sé si esto es sabio. Por otro lado, evita ciertos errores. En mi opinión: si myVariable siempre debe ser verdadero para ejecutar la función, use el ejemplo dos. Si es opcional usa el ejemplo uno. – Tim

+0

Si está preguntando sobre el costo de llamar a una función, entonces sí hay algún costo, pero cuánto dependerá de la implementación de JavaScript. Hay menos costo en implementaciones más nuevas, pero el costo aún está allí. –

+1

Cuida las libras y los centavos se ocuparán ellos mismos :-) – spraff

Respuesta

11

It Just Doesn't Matter (aunque el primer método evita algo de trabajo por lo que debe más rápido, pero en una cantidad que es probablemente menor que el ruido estadístico).

Lo que realmente importa es el método que mejor representa la lógica. La regla de oro es que cada enunciado de una función debe tener aproximadamente el mismo nivel de abstracción. ¿Es la expresión condicional más o menos abstracta que la llamada a la función?

+1

Entiendo y acepto su afirmación de que no importa. Pero esta pregunta tiene una respuesta correcta, y "Simplemente no importa" no es la respuesta correcta. Me gustaría que su respuesta establezca claramente la respuesta correcta, y utilice el punto "no importa" como una idea de último momento. Realmente no importa en el 99,99% de los casos, pero si intentas crear un servidor web Node capaz de manejar millones de solicitudes por segundo, probablemente sea importante hasta cierto punto. –

+1

Si maneja millones de solicitudes por segundo, este no es su cuello de botella. La respuesta correcta es "seguir las reglas del mejor diseño, no las reglas de la mejor optimización". – spraff

1

Me parece que el segundo método hace que el código sea más fácil de mantener y fácil de leer. Esto implica muy poca sobrecarga.

+1

Tal vez, quizás no. Depende de las circunstancias, ¿no? – spraff

1

Sería más rápido hacerlo fuera porque, al hacer una llamada a la función cada vez será ligeramente más lento que comprobar primero y luego llamar a la función.

¿Pero por qué molestarse? Nadie va a notar una llamada de función frente a lo que está haciendo realmente la llamada de función. Los selectores de DOM ineficaces que hacen que su código tenga que cazar y picotear a través de una estructura de árbol enorme para unas pocas agujas en el pajar constituyen una amenaza mucho mayor para el rendimiento.

+0

Un pequeño contexto: normalmente estaría de acuerdo en que es una diferencia realmente minúscula de la que normalmente no vale la pena preocuparse, pero el código es una biblioteca que otras personas usarán, por lo que realmente no necesita ser un cuello de botella. – Richard

+0

En realidad, olvídate de eso. Acabo de leer el artículo y en resumen: estoy preocupado por nada. – Richard

1

Es insignificante; las diferencias en el rendimiento son minúsculos, y los navegadores parecen manejar esto de manera diferente:

Editar: En efecto, existe una diferencia en el rendimiento: la mayoría de los navegadores ejecutan Método 1 un poco más rápido.

//Method 1: 

var t1 = Date.now(); 

myVariable = true; 

for(var i = 0; i < 20000000; i++) { 



    function doSomething() 
    { 
     Math.sin(Math.cos(0)); 
    } 

    if (myVariable) { 
     doSomething() 
    } 

    myVariable = !myVariable; 
} 

console.log(Date.now() - t1); 







//Method 2: 

var t1 = Date.now(); 

myVariable = true; 

for(var i = 0; i < 20000000; i++) { 

    function doSomething() 
    { 
     if (myVariable) { 
      Math.sin(Math.cos(0)); 
     } 
    } 


    doSomething(); 

    myVariable = !myVariable; 

} 

console.log(Date.now() - t1); 





//Results: 
//Safari: About the same, former was slightly quicker 
//Firefox: Former was quicker 
//Chrome: About the same, latter was somewhat quicker 
//Opera: Executed the former quicker 
+1

Su 'myVariable' siempre es 'verdadero', por lo que no está realmente midiendo el costo de llamar a una función (porque siempre se está llamando). –

+0

Editar: Tiene razón, hay una diferencia, la actualizaré. –

+0

Su prueba es pobre porque está obligando al intérprete deficiente a _recreate_ la misma función una y otra vez millones de veces. Por lo tanto, está midiendo la sobrecarga de la función _creación_, no la función _invocación_. – Alnitak

Cuestiones relacionadas