浏览器引擎是否会压缩大型重复出现的对象中的键名?

时间:2015-05-26 13:01:48

标签: javascript

本着这两个问题的精神:

浏览器如何处理相同对象类型的大型数组,它们的键名是否以某种方式压缩在内存中?我曾经使用过一个图形库,通过缩短对象的关键名来获得性能提升,所以我有点坚持这种思维方式。如果我使用1,000,000个这样的对象的数组,它似乎会产生影响:

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

或1,000,000个此类对象的数组:

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

虽然看起来第一个应该使用大约两倍的内存,因为它的长键名?

1 个答案:

答案 0 :(得分:3)

你可以在这里讨论两件不同的事情。第一个,更简单的是 JSON字符串,即您例如从Web服务接收的数据。这是一个字符串,字符串中的所有内容都很重要,就是JSON属性名称,甚至是空格。最好通过减少网络负载的方式来最小化这一点(您也可以通过gzip数据来获得良好的效果)。

实际的字符串大小可能不会成为问题,因为您通常不会长时间保留JSON字符串。这是因为当你解析 JSON时,你会得到一个标准的JavaScript对象。

因此,您更有可能要求的是具有较长属性名称的JavaScript对象是否比具有较短属性名称的JavaScript对象占用更多内存。答案显然是肯定的,因为你需要将信息放在某个地方。但这只是答案的一半;当您查看具有相同属性集的多个对象时,它会变得更有趣。

在这里,string interning开始发挥作用。好的JavaScript引擎将对字符串使用字符串实习,因此在一个字符串包含"firstNameAsWrittenInID"之后,包含相同值的每个其他字符串应该能够重用该实例化的字符串对象,从而导致内存占用量较小。所以在这种情况下,重用长字符串或短字符串没有区别。

当然,原始字符串需要存储一次,因此如果您有许多不重复的长属性,那么以某种方式缩短它们是个好主意。但是,如果您一直重用属性名称,则可能不会导致任何额外的内存开销。