2011-09-10 9 views
15

¿Cuáles son las características de rendimiento del acceso a la propiedad de JavaScript (en las implementaciones actuales)?Javascript big-O rendimiento de acceso a la propiedad

  • ¿Es seguro asumir que el acceso a la matriz es O (1)?
  • Si uso un objeto como una tabla hash (con claves de cadena) ¿puedo asumir con seguridad O (1) u O (log n) el tiempo de acceso?

  • ¿Hay navegadores o ambientes que son significativamente más rápido/lento que los demás comunes y que debería mantener un ojo para?

  • ¿Los estándares de JavaScript tienen algo que decir?

Y lo más importante:

  • ¿Dónde puedo encontrar una buena referencia para este tipo de problemas de rendimiento de JavaScript asintótica?
+0

¿Qué le dice la investigación que ha hecho por su cuenta sobre cualquiera de estas preguntas? –

+2

No quiero hacer mucha investigación por mi cuenta en algo que a) Probablemente me equivoque de todos modos yb) Es muy probable que ya lo haya hecho alguien más versado en el tema que yo. – hugomg

+0

Actualización: [¿Hay algo que garantice un tiempo constante para acceder a una propiedad de un objeto en JavaScript?] (Http://stackoverflow.com/q/34292087/1048572) – Bergi

Respuesta

6

Todos los objetos en JavaScript se implementan como un hash de objeto, por lo que no existe una diferencia funcional.

Por ejemplo, visita esta prueba:

var arr = []; 
arr[5] = 5; 
arr['5'] = 'not 5'; 
console.log(arr.length, arr); 
// output: 6 [undefined, undefined, undefined, undefined, undefined, "not 5"] 

Los números se stringified cuando se utiliza como posiciones.

Ver Crockford's website sobre JavaScript para obtener más información. La parte es especialmente importante en el epígrafe de "conjuntos":

Arrays in JavaScript are also hashtable objects.

rendimiento no es realmente un problema a menos que tenga un montón de objetos para realizar un seguimiento de los (como más de 500.000), en cuyo caso' Probablemente esté haciendo algo mal.

Hay optimizaciones que puede hacer, pero en realidad no tienen sentido a menos que esté haciendo algo antinatural con JavaScript (como algoritmos de compresión ... Trabajé en una implementación de LZMA en JS ... mala idea).

Nota:

Si usted tiene un juego de repuesto (como se define sólo 10 índices de cada 10.000), probablemente debería ser el uso de un objeto de regular. Las matrices inicializarán los 10 000 índices en "indefinido", mientras que Object.keys(obj) solo informarán los 10 que ha establecido. Esta es una optimización menor que realmente tiene sentido.

+1

Sé cómo se comportan los objetos y las matrices, pero Realmente quiero saber qué pasa con los números grandes. Probablemente no necesites ir a 500000 de todos modos, si algo resulta ser O (N^2) solo unos pocos miles deberían ser suficientes para comenzar a preocuparte. – hugomg

+2

Lee el enlace. Las matrices son tablas hash. Esto significa que probablemente sea O (logn) para las búsquedas (hay mucha optimización allí).Mi compañero de trabajo realizó algunas pruebas y descubrió que no era significativo hasta que obtuvo más de 50,000 o algo más grande. – tjameson

Cuestiones relacionadas