馃敟 TIMING (CRONOMETRAJE DEL C脫DIGO)

Supongamos que tenemos la siguiente funci贸n que calcula la suma de todos los n煤meros de 1 a N.

function sumarNumeros(n) {
    let suma = 0;
    for (let i = 0; i <= n; i++) {
        suma += i;
    }
    return suma;
}

El mismo resultado se puede obtener con la siguiente funci贸n.

function sumarNumeros(n) {
    return (n * (n + 1)) / 2;
}

Para determinar cual de las dos funciones es mejor tenemos que cuestionarnos.

  • 驴Cu谩l es la funci贸n mas r谩pida?
  • 驴Cu谩l utiliza menos memoria?
  • 驴Cu谩l es mas sencilla de entender?

De las opciones anteriores las dos que suelen ser mas importantes son mayor rapidez y menor consumo de la memoria.

驴Qu茅 es el timing (cronometraje)?

El timing (cronometraje) consiste en medir el tiempo que toma a un algoritmo completar su ejecuci贸n, esto permite medir la velocidad con la que es capaz de completar una tarea.

Una forma de hacerlo en JavaScript es calculando el tiempo entre el punto antes de ejecutar la funci贸n y despu茅s de completarla. Para ello podemos usar el objeto performance.

function sumarNumeros(n) {
    let suma = 0;
    for (let i = 0; i <= n; i++) {
        suma += i;
    }
    return suma;
}

const time1 = performance.now();
console.log(sumarNumeros(1000));
const time2 = performance.now();
console.log("El tiempo de ejecuci贸n es", time2 - time1);
500500
El tiempo de ejecuci贸n es 3.092143999878317

Si ejecutamos varias veces el mismo c贸digo este nos entregar谩 diferentes resultados en relaci贸n al tiempo.

Ahora con la segunda funci贸n.

function sumarNumeros(n) {
    return (n * (n + 1)) / 2;
}

const time1 = performance.now();
console.log(sumarNumeros(1000));
const time2 = performance.now();
console.log("El tiempo de ejecuci贸n es", time2 - time1);
500500
El tiempo de ejecuci贸n es 2.6364869996905327

Como podemos ver esta funci贸n se ejecuta de manera mas r谩pida comparada con la anterior.

驴Por qu茅 el timing no es una soluci贸n adecuada?

Los problemas que presenta el timng al momento de medir el la velocidad son:

  • Diferentes equipos reportar谩n diferentes tiempos de ejecuci贸n.
  • El mismo equipo va a reportar diferentes tiempos de ejecuci贸n.
  • Para algoritmos r谩pidos, la medici贸n de la velocidad no ser谩 precisa.

驴Cu谩l es la alternativa al timing?

En lugar de contar segundos una posible soluci贸n los cuales siempre ser谩n variables, una mejor opci贸n es contar operaciones que el computador tiene que realizar.

En esta funci贸n…

function sumarNumeros(n) {
    return (n * (n + 1)) / 2;
}

Tenemos las operaciones…

  • Una multiplicaci贸n (*)
  • Una suma (+)
  • Una divisi贸n \

Tenemos 3 operaciones, es decir N = 3

Ahora analizamos la otra funci贸n que utiliza un bucle.

function sumarNumeros(n) {
    let suma = 0;
    for (let i = 0; i <= n; i++) {
        suma += i;
    }
    return suma;
}

Tenemos las operaciones…

  • Una asignaci贸n (suma = 0)
  • Una asignaci贸n (i = 0)
  • n comparaciones (i<=n)
  • n incremetos (i++)
  • n asignaciones (i++)
  • n sumas (total += i)
  • n igualdades (total += i)

Dependiendo del valor de n, la funci贸n puede llegar a ser tan compleja como 5n + 2.

En este segundo ejemplo el numero de operaciones incrementa proporcionalmente en base al valor de n.