Me pregunto cómo medir la memoria total utilizada por la función en JavaScript. Descubrí que hay una API performance.memory
. Me di cuenta de que usedJSHeapSize
no es solo para una sola página, sino que también puede compartir el resumen entre otras pestañas. Supongamos que, en mi caso, siempre he abierto solo una pestaña, por lo que debo medir la memoria solo de esta pestaña que me interesa. También leí que debo esperar un tiempo después de la ejecución de la función para permitir que el recolector de basura borre toda la memoria no utilizada. . Al final, se me ocurrió una solución a continuación, pero no sé si es una buena idea y es la forma en que mido la memoria correcta. Si tiene alguna idea al respecto, hágamelo saber, por favor.
function wait(ms) { return new Promise((resolve) => setTimeout(resolve, ms)); } function fun1() { // function logic... } function fun2() { // function logic... } function measureMemory(functionToMeasure) { const memoryStart = performance.memory.usedJSHeapSize; functionToMeasure(); const memoryEnd = performance.memory.usedJSHeapSize; return memoryEnd - memoryStart; } async function runBenchmark() { const totalMemoryUsedByFun1 = measureMemory(fun1); // I wait 2min to be sure garbage collector clean all unused memory await wait(120000); const totalMemoryUsedByFun2 = measureMemory(fun2); }
¿Qué piensas, es un buen enfoque/idea de medir la memoria utilizada por función? ¿2min es tiempo suficiente para que el recolector de basura borre la memoria no utilizada?
function fun1() { // alocates 1000KB } function fun2() { // alocates 300KB } // initial heap size = 0 const memoryUsedByFun1 = measureMemory(fun1()); // Heap size is equal 1000KB // Now let's say I do not wait for GC and only 500KB have been released // heap size before measuring fun2 is equal to 500KB const memoryUsedByFun2 = measureMemory(fun2()); // While fun2 is running, 500KB of fun1 allocations have been released // So now if I do memoryStart - memoryEnd // Where memory start was 500KB and memory end is equal to 300KB // because 500KB was released while computing fun2 // I will get result 500KB - 300KB = 200KB // What is not true because fun2 allocates 300KB)
También he visto que existe tal API
measureUserAgentSpecificMemory()
, pero creo que esta API no funciona en absoluto incluso después de activar#experimental-web-platform-features
¿Por qué estás esperando al recolector de basura?
Ya está diferenciando memoryEnd - memoryStart
por lo que incluso si todavía tiene memoria residual asignada en el montón cuando comienza, verá la diferencia al final.
¿Le preocupa que gc
limpie la memoria residual MIENTRAS se ejecuta la segunda función?
Por lo general, gc se ejecuta exactamente después de llamar a una función. Si tiene referencias circulares, usará el algoritmo de marca y barrido para recolectar basura más tarde, ya que no puede determinar con el algoritmo de conteo de referencias si el objeto todavía se usa (pero supongo que espera a que la pila esté libre para ejecutarlo). —- LE: En realidad no espera por lo que tu preocupación es válida.
Aquí hay un buen artículo que encontré sobre el recolector de basura en js