Tengo un contenedor de cola crítico para el rendimiento que hace muchas inserciones/eliminaciones aleatorias. En mi clase de contenedor, tengo un Uint32Array de tamaño fijo llamado actualizaciones y en mi lógica de inserción, necesito comparar un valor con cada valor en esta matriz de actualización.
Originalmente, lo hice simplemente así:
const u = this.updates; for (let i = 0; i < u.length; i++) bucket_offset += bi >= u[i];
Luego, justo cuando estaba dando los toques finales al contenedor y solo estaba atornillando, intenté desenrollar dicho lazo.
const u = this.updates; bucket_offset += (bi >= u[0]) + (bi >= u[1]) + (bi >= u[2]) + (bi >= u[3]) + (bi >= u[4]) + (bi >= u[5]) + (bi >= u[6]) + (bi >= u[7]) + (bi >= u[8]) + (bi >= u[9]) + (bi >= u[10]) + (bi >= u[11]) + (bi >= u[12]) + (bi >= u[13]) + (bi >= u[14]) + (bi >= u[15]);
Y resulta que esto es alrededor de 10 veces más rápido en Chrome, lo que hace que todo el inserto sea un 30 % más rápido.
Después de esa revelación, estoy buscando una manera de hacer que la VM comprenda que está bien desenrollar ese ciclo, después de todo, this.updates.length es una constante.
Al final del día, puede permanecer como está, pero preferiría un bucle, ya que se vería mejor. ¿Algunas ideas?
Mi objetivo principal es el navegador Chrome que se ejecuta en V8.