Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

81
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda