javascript - tomar - momento drastico
Chrome piensa que 99,999 es drásticamente diferente de 100,000 (3)
Bueno, siempre hay algún número de umbral cuando diseña algoritmos que se adaptan al tamaño de los datos (por ejemplo, SharePoint cambia la forma en que funciona cuando se agregan 1000 elementos a una lista ). Por lo tanto, supongo que ha encontrado el número real y el rendimiento difiere, ya que se utilizan diferentes estructuras de datos o algoritmos.
Me encontré con un problema muy interesante cuando alguien publicó un punto de referencia jsperf que entraba en conflicto con un punto de referencia anterior, casi idéntico, que manejé.
Chrome hace algo drásticamente diferente entre estas dos líneas:
new Array(99999); // jsperf ~50,000 ops/sec
new Array(100000); // jsperf ~1,700,000 ops/sec
puntos de referencia: http://jsperf.com/newarrayassign/2
Me preguntaba si alguien tiene alguna pista sobre lo que está pasando aquí.
(Para aclarar, estoy buscando algunos detalles de bajo nivel sobre las partes internas de V8, como si estuviera usando una estructura de datos diferente con una frente a la otra y cuáles son esas estructuras)
No sé qué sistema operativo está utilizando, pero si esto es Linux, sospecho que Chrome (es decir, malloc
) está asignando memoria desde un montón administrado por programa (tamaño determinado mediante la sbrk
sistema sbrk
, y la libre listas son manejadas por la biblioteca estándar de C), pero cuando alcanzas un cierto umbral de tamaño, cambia a usar mmap
para pedirle al núcleo que asigne grandes porciones de memoria que no interfieran con el montón sbrk
sbrk.
Doug Lea describe cómo malloc
funciona en la Biblioteca GNU C, mejor que yo. Él lo escribió.
O tal vez 100000 hits algún tipo de umbral mágico para la cantidad de espacio necesario que desencadena el recolector de basura con más frecuencia al tratar de asignar memoria.
Solo porque esto sonaba bastante interesante, busqué a través de la base de código de V8 una estática definida como 100000, y encontré esta kInitialMaxFastElementArray
var , que es la utilizada posteriormente en la función de función ArrayConstructInitializeElements
incorporada . Si bien no soy programador de CA y no conozco los detalles aquí, puede ver que está utilizando un bucle if
para determinar si es más pequeño que 100.000 y return
en diferentes puntos según eso.