Saltar al contenido

Complejidad temporal de JavaScript array.largo

Puede que se de el caso de que encuentres algún fallo con tu código o trabajo, recuerda probar siempre en un entorno de testing antes subir el código al trabajo final.

Solución:

Creo que sería constante ya que parece que la propiedad se establece automáticamente en todas las matrices y solo lo estás buscando.

Derecha. Es una propiedad que se almacena (no se calcula) y se actualiza automáticamente según sea necesario. La especificación es explícita al respecto aquí y aquí, entre otros lugares.

En teoría, un motor de JavaScript sería libre de calcular length en el acceso como si fuera una propiedad de acceso, siempre y cuando no pudiera decirlo (lo que significaría que no podría ser literalmente una propiedad de acceso, porque puede detectarlo en el código), pero dado que length se usa repetidamente un lote (for (let n = 0; n < array.length; ++n) me viene a la mente), creo que podemos suponer que todos los motores de JavaScript de uso generalizado hacen lo que dice la especificación o al menos algo que es acceso de tiempo constante.


Solo FWIW: recuerde que las matrices estándar de JavaScript son, en teoría, solo objetos con un comportamiento especial. Y En teoria, los objetos de JavaScript son bolsas de propiedades. Por lo tanto, buscar una propiedad en una bolsa de propiedades podría, en teoría, depender de cuántas otras propiedades haya, si el objeto se implementa como algún tipo de mapa hash de nombre->valor (y solía serlo, en los viejos tiempos). ). Los motores modernos optimizan los objetos (el V8 de Chrome crea clases dinámicas sobre la marcha y las compila), pero las operaciones en esos objetos aún pueden cambiar el rendimiento de la búsqueda de propiedades. Agregar una propiedad puede hacer que V8 cree una subclase, por ejemplo. Eliminar una propiedad (en realidad usando delete) puede hacer que V8 se dé por vencido y vuelva a caer en el "modo diccionario", lo que degrada sustancialmente el acceso a la propiedad en el objeto.

En otras palabras: puede variar de motor a motor, incluso de objeto a objeto. Pero si usa arreglos puramente como arreglos (sin almacenar otros noarray propiedades en ellos), lo más probable es que obtenga una búsqueda en tiempo constante.

No parece un cuello de botella, pero si quiere estar seguro, use var len = arr.length y comprueba eso. No duele y parece ser un poco más rápido en mi máquina, aunque no es una diferencia significativa.

var arr = [];
for (var i = 0; i < 1000000; i++) 
  arr[i] = Math.random();



var start = new Date();
for (var i = 0; i < arr.length; i++) 
   arr[i] = Math.random(); 


var time1 = new Date() - start;
var start = new Date();

for (var i = 0, len = arr.length; i < len; i++) 
  arr[i] = Math.random();


var time2 = new Date() - start;

document.getElementById("output").innerHTML = ".length: " + time1 + "
nvar len: " + time2;

Comentarios y valoraciones del post

Nos encantaría que puedieras difundir este artículo si te fue de ayuda.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *