He notado un comportamiento extraño en Javascript cuando se instancia una class con defined variables .
Nota: el código a continuación simplemente sirve como un caso de reproducción para este problema específico.
Consideremos la siguiente clase:
class Vector3 { #unused1; #unused2; #unused3; #unused4; #unused5; #unused6; #unused7; #unused8; #unused9; #unused10; #unused11; #unused12; #unused13; constructor(x, y, z) { this.x = x; this.y = y; this.z = z; } }Y el siguiente guión:
let frames = 0; let p = 0; let fn = () => { let now = performance.now(); let sum; for (let i = 0; i < 10000; i++) { var vector = new Vector3(Math.random(),Math.random(),Math.random()); var o = new Vector3(vector.x + Math.random(), vector.y + Math.random(), vector.z + Math.random()); } // check the amount of passed frames every second if (now - p >= 1000) { console.log(frames); // added to also test performance without having Dev Tools open document.documentElement.innerText = frames; frames = 0; p = now; } frames++; requestAnimationFrame(() => { return fn(); }) return; } fn();Al ejecutar lo anterior y ver la consola, podemos ver que el rendimiento es de alrededor de 30 a 35 fotogramas (según sus especificaciones).
Ahora, si modificamos la clase para que no contenga variables definidas como tales:
class Vector3 { constructor(x, y, z) { this.x = x; this.y = y; this.z = z; } }Podemos ver que el rendimiento sube a (nuevamente, dependiendo de sus especificaciones) 60 fotogramas o más.
Al principio, pensé que este problema tenía que ver con garbage collection de elementos no utilizados, pero después de revisar Chrome Profiler , noté que la mayor parte del rendimiento se estaba consumiendo al getting variables y, después de más investigaciones/evaluaciones comparativas, noté que este problema no tenía nada que ver con las variables. in use , pero las variables declared .
También es importante tener en cuenta que no parece "importar" si la variable se declara como private o public .
¿Alguien tiene una explicación de por qué ocurre este problema?
Actualización: este problema parece afectar más a Chromium que a Firefox . Firefox "siempre" parece llegar a 60.
El problema de rendimiento que destaca fue un caso no optimizado en el que la inicialización de los campos era lenta. Eso existió hasta Chrome 96. Ahora está arreglado en Chrome 97, que se lanzó a principios de enero de 2022.
Aquí hay algunas pruebas.