Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

80
Vistas
Complejidad de tiempo de segmento en tiempo de ejecución de javascript v8

Según MDN

El método slice() devuelve una copia superficial de una parte de una matriz

Eso significa que podría devolver el puntero al índice de inicio en la complejidad de tiempo O(1) . Pero en muchas discusiones, veo O(n) especificado (enlazado a continuación).

Enlaces:

  • Complejidad del tiempo de ejecución de JavaScript de las funciones de matriz

  • Complejidad de tiempo para métodos Javascript en V8

Estaba echando un vistazo a la implementación de v8 pero no lo entendí.
https://chromium.googlesource.com/v8/v8/+/4.3.49/src/string.js?autodive=0%2F%2F

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

(Desarrollador V8 aquí.)

Array.prototype.slice es O(n), donde n es el número de elementos en el segmento.
String.prototype.slice es O(1), gracias a nuestra implementación de SlicedStrings , que solo almacena el puntero, el desplazamiento, la longitud de la cadena original y evita copiar los caracteres (excepto cuando son pequeños, por lo que copiar un puñado de caracteres es en realidad más barato y más pequeño que almacenar una referencia; eso sigue siendo O(1)).

La diferencia clave es que las cadenas son inmutables y las matrices no. Cuando haces str1 = "Hello World"; str2 = str1.slice(2, 5); , dado que no hay forma de modificar el contenido de str1 después, str2 no necesita asegurarse de que no se vea afectado por dicha modificación.
Cuando haces a = [1, 2, 3, 4]; b = a.slice(1, 3); a[1] = "changed"; console.log(b[0]); , entonces espera ver 2 , no "changed" . Es por eso que b tiene que ser una copia real. (En teoría, sería posible un enfoque de copia en escritura, pero V8 no hace eso para los segmentos de matriz).

"Copia superficial" significa que los objetos anidados no se copiarán. Ejemplo:

 let nested = {property: "value"}; var a = [nested]; var b = a.slice(0, 1); a[0].property = "new value"; console.log(a === b); // false, `b` is a copy console.log(a[0] === b[0]); // true, `nested` was not copied console.log(b[0] === nested); // true console.log(b[0].property); // "new value"
about 4 years ago · Juan Pablo Isaza Denunciar

0

Basado en mi lectura (es decir, podría estar equivocado, ya que V8 es una bestia complicada) de este código fuente array-slice.tq , la respuesta es: "depende".

Si es posible (y la heurística en cuanto a cuándo podría suceder, realmente no llegué), V8 optimiza las cosas esencialmente a O (1) simplemente devolviendo una vista de copia en escritura a la matriz original a través ExtractFastJSArray .

Cuando eso falla, V8 asigna una nueva matriz y copia el objeto (punteros), que por supuesto es O (N).

El código fuente de tq incluye muchos casos "te pillé", ya que JavaScript te permite llamar a Array.prototype.slice() en cosas que no son realmente arreglos.

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda