¿Los motores de búsqueda comprimen los nombres clave en grandes conjuntos de objetos recurrentes?

En el espíritu de estas dos preguntas:

  • ¿Vale la pena el esfuerzo para tratar de reducir el tamaño de JSON?
  • Objetos de respuesta JSON: ¿teclas “bonitas” y respuesta más grande o teclas cortas y respuesta más pequeña?

¿Cómo maneja un navegador las matrices grandes de los mismos tipos de objetos, de alguna manera sus nombres de clave están comprimidos en la memoria? Una vez usé una biblioteca de gráficos y obtuve una ganancia de rendimiento al acortar los nombres clave de los objetos, por lo que estoy más o menos pegado a esa mentalidad. Sin embargo, parece que no haría una diferencia si usara una matriz de 1,000,000 de tales objetos:

[{ "firstNameAsWrittenInID": Pete, "lastNameAsWrittenInID": Jenkins },{ "firstNameAsWrittenInID": Jane, "lastNameAsWrittenInID": Jenkins }, ... { "firstNameAsWrittenInID": Johann, "lastNameAsWrittenInID": Abele }] 

o una matriz de 1,000,000 de tales objetos:

 [{ "f": Pete, "l": Jenkins },{ "f": Jane, "l": Jenkins }, ... { "f": Johann, "l": Abele }] 

¿Aunque parece que el primero debería usar aproximadamente el doble de la memoria debido a sus nombres de clave largos?

Hay dos cosas diferentes de las que puedes hablar aquí. La primera y más simple es las cadenas JSON , es decir, los datos que, por ejemplo, recibe de un servicio web. Esta es una cadena, y todo en una cadena importa, ya sean los nombres de propiedades de JSON, o incluso los espacios en blanco. Es una buena idea minimizar esto para reducir la carga de la red (también puede gzip los datos para obtener un buen efecto).

Es probable que el tamaño real de la cadena no sea un problema, ya que por lo general no mantienes la cadena JSON por mucho tiempo. Esto se debe a que cuando analiza JSON, obtiene un objeto JavaScript estándar de nuevo.

Entonces, lo que es más probable que preguntes es si los objetos de JavaScript con nombres de propiedad más largos llevan más memoria que aquellos con nombres de propiedad más cortos. La respuesta es obviamente sí, ya que necesita poner la información en algún lugar. Pero eso es sólo la mitad de la respuesta; se está volviendo más interesante cuando observas varios objetos con el mismo conjunto de propiedades.

Aquí, el internado de cuerdas entra en juego. Los buenos motores de JavaScript utilizarán el internado de cadena para las cadenas, por lo que después de que una cadena contenga "firstNameAsWrittenInID" , cada otra cadena que contenga el mismo valor debería poder reutilizar ese objeto de cadena internado, dando como resultado una pequeña huella de memoria. Entonces, en este caso, no hay diferencia entre reutilizar una cadena larga o una cadena corta.

Por supuesto, la cadena original debe almacenarse una vez , por lo que si tiene muchas propiedades largas que no se repiten, es una buena idea acortarlas de alguna manera. Pero si reutiliza los nombres de propiedades todo el tiempo, es probable que esto no provoque ningún gasto de memoria adicional.