Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

83
Views
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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!