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

320
Views
¿Cómo inspecciono si una propiedad de objeto es una propiedad dentro del objeto, una propiedad rápida o una propiedad lenta en v8?

La publicación https://v8.dev/blog/fast-properties menciona que hay tres tipos de propiedades. ¿Cómo puedo saber cuál es una propiedad?

Espero respuestas con una función de sintaxis nativa v8 o una función devtool.

about 4 years ago · Santiago Gelvez
2 answers
Answer question

0

(Desarrollador V8 aquí.)

Si un objeto tiene propiedades de modo de diccionario es una decisión por objeto (no por propiedad). El estado alternativo es tener propiedades "rápidas", lo que normalmente significa una combinación de propiedades dentro y fuera del objeto.

Cualquier compilación de V8 que se ejecute con --allow-natives-syntax puede usar %HasFastProperties(obj) para saber si un objeto tiene propiedades "rápidas" (el valor devuelto es true ) o propiedades de diccionario ( false ).

Para ver cuántas propiedades en el objeto tiene un objeto en modo "rápido", necesita una compilación de depuración y usar %DebugPrint(obj) .

Que yo sepa, DevTools no expone esta información. (Lo cual está bien en mi humilde opinión, ya que no debería preocuparse por esto, aparte de la curiosidad).

Nota al margen: creo que "rápido" y "lento" son descripciones muy engañosas, porque suenan demasiado como "buen caso" y "mal caso", cuando en realidad tienen diferentes puntos fuertes y débiles. Los objetos que rastrean el diseño preciso de sus propiedades usando su clase oculta son rápidos para leer/escribir los valores de las propiedades existentes, pero extremadamente lentos para agregar/eliminar propiedades. Los objetos que usan un diccionario para sus propiedades son un poco más lentos para leer/escribir valores de propiedad, pero mucho más rápidos para agregar/eliminar propiedades. Entonces, según el caso de uso de su aplicación, a veces desea uno y otras veces el otro, y aparte de los casos patológicos, el motor también es bastante bueno para cambiar a uno u otro, y no hay un estado de objeto que sea claramente mejor que el otro. (Y si sabe que agregará y eliminará muchas propiedades, el uso de un Map le brindará un mejor rendimiento que el uso de objetos simples).

about 4 years ago · Santiago Gelvez Report

0

Aquí hay una breve explicación de la diferencia entre las propiedades rápidas y lentas. Cuando se crea un objeto en JS, se le adjunta una clase oculta. Cuando se agrega una propiedad al objeto, ocurre una "transición de clase" (la antigua clase oculta cambia a una nueva clase oculta con la nueva propiedad en ella)

Cuando V8 ve que se declara una función de constructor de clase, crea una clase oculta, por ejemplo: C0. Ahora, cuando V8 ve en la siguiente línea que se agrega una propiedad, en nuestro ejemplo: nombre actualiza el C0 con la nueva propiedad y cambia de C0 a una nueva clase oculta, digamos C1, luego ve la siguiente propiedad: edad y cambia a C2 .

Agregar nuevas propiedades dinámicamente a los objetos de 2 personas en este ejemplo no es una solución optimizada porque el orden en el que se instancian las dos nuevas propiedades (me gusta y no me gusta) es diferente. Un orden diferente da como resultado la creación de dos clases ocultas diferentes en lugar de compartir una clase oculta común.

Entonces: creamos C0 para la función constructora persona. Pasa a C1 por nombre y luego a C2 por edad. Para person1, cuando ve una propiedad "me gusta" y pasa a C3a y para "no me gusta" a C4a. PERO, para person2 V8 primero ve que se le agrega la propiedad "no le gusta" y, por lo tanto, en lugar de compartir la clase oculta C3a, crea una nueva clase oculta C3b. Luego crea una nueva clase oculta para propiedades como C4b.

Dado que los dos objetos no comparten las clases ocultas (cuando podrían haberlas compartido); el acceso a las propiedades del objeto es lento porque V8 ahora no puede utilizar el almacenamiento en caché en línea. Si los dos hubieran compartido la clase oculta, V8 habría utilizado el almacenamiento en caché en línea para un acceso más rápido. Entonces, en el ejemplo a continuación, esas son propiedades lentas. Habría sido rápido si el pedido fuera el mismo.

Espero que esto ayude un poco.

 function person(name,age) { this.name = name; this.age = age; } let person1 = new person("jim", 28); let person2 = new person("jane", 27); person1.likes = "games"; person1.dislikes = "running"; person2.dislikes = "cities"; person2.likes = "nature";

about 4 years ago · Santiago Gelvez 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!