Encontré varios artículos en Internet y preguntas aquí sobre cómo medir el rendimiento del código en Node. Pero obtuve resultados que difieren aproximadamente dos veces, dependiendo de la herramienta de medición. La función objetivo es:
let arr = [75, 283, 361, 168, 23, 489, 421, 95, 72, 380, 384, 470, 235, 465, 276, 26, 364, 416, 373, 184, 211, 239, 485, 18, 19, 252, 447, 6, 291, 324, 497, 352, 458, 201, 238, 116, 333, 163, 207, 417, 340, 431, 5, 269, 258, 178, 182, 295, 257, 434, 37, 372, 154, 223, 313, 80, 71, 229, 379, 181, 396, 281, 491, 58, 254, 359, 79, 175, 143, 214, 217, 148, 393, 246, 34, 166, 251, 381, 413, 180, 338, 442, 494, 378, 123, 118, 395, 446, 459, 472, 457, 51, 127, 351, 389, 157, 260, 370, 405, 346] const { performance } = require("perf_hooks") function summBrute(arr, k) { for(let i = 0; i < arr.length; i++) { for(let j = i + 1; j < arr.length; j++) { if(arr[i] + arr[j] == k) { return true; } } } return false; }Y los métodos de medición son:
console.time('summBrute') summBrute(arr, 394) console.timeEnd('summBrute') var t0 = performance.now() summBrute(arr, 394) // var t1 = performance.now() console.log("Call to summBrute took " + (t1 - t0) + " milliseconds.") Aquí quiero averiguar si hay dos números en la matriz en cuestión, agregue cuál, obtengo el segundo argumento de la función llamada. Utilizo estos dos métodos independientemente uno del otro, simplemente comentando la sección correspondiente del código. console.time() proporciona una puntuación de rendimiento media de 0,300 ms resultado de console.time
y performance.now() da 0.170ms de resultado performance.now
Por favor, ayúdenme a entender por qué ESTOS dos métodos en particular dan resultados diferentes (casi el doble)? Estoy usando Node v15, CPU Core i5, 8 GB de RAM, Win10.
Si coloca las medidas en un pequeño bucle, verá que apenas son consistentes entre sí.
for(let i=0;i<5;i++){ console.time('summBrute') summBrute(arr, 394) console.timeEnd('summBrute') var t0 = performance.now() summBrute(arr, 394) // var t1 = performance.now() console.log("Call to summBrute took " + (t1 - t0) + " milliseconds.") }produce
summBrute: 0.234ms Call to summBrute took 0.1938999891281128 milliseconds. summBrute: 0.171ms Call to summBrute took 0.13520002365112305 milliseconds. summBrute: 0.107ms Call to summBrute took 0.1332000494003296 milliseconds. summBrute: 0.095ms Call to summBrute took 0.10259997844696045 milliseconds. summBrute: 1.385ms Call to summBrute took 0.10839998722076416 milliseconds.
son números casi aleatorios, inútiles.
Sin embargo, si llamo a summBrute() 10 millones de veces:
for(let i=0;i<5;i++){ console.time('summBrute') for(let j=0;j<10000000;j++) summBrute(arr, 394) console.timeEnd('summBrute') var t0 = performance.now() for(let j=0;j<10000000;j++) summBrute(arr, 394) // var t1 = performance.now() console.log("Call to summBrute took " + (t1 - t0) + " milliseconds.") }Los resultados dejan de depender del estado de ánimo de mi computadora y se vuelven mucho más consistentes:
summBrute: 16.369s Call to summBrute took 16184.267899990082 milliseconds. summBrute: 15.643s Call to summBrute took 15852.86260008812 milliseconds. summBrute: 16.355s Call to summBrute took 15942.392500042915 milliseconds. summBrute: 16.190s Call to summBrute took 16314.965299963951 milliseconds. summBrute: 16.523s Call to summBrute took 16744.983800053596 milliseconds.
Todavía tiene una extensión de casi medio segundo, pero es bastante visible que el promedio (de 10 millones de llamadas) es de alrededor de 16 segundos y, por lo tanto, una llamada es de alrededor de 0,016 ms, que claramente no es lo que midió ninguna de las llamadas individuales.
TL; DR: el tiempo es el tiempo, importa mucho más lo que mide que la API del temporizador que elija.