在一个优化超大数据量性能问题上,让我产生了研究该讨论话题。

话不多说,直接上代码。

10W 和 100W条数据代码

var rowData = {
  key: '1',
  name: '张三',
  age: 32,
  address: '西湖区湖底公园1号',
}

var maxNum = 1000000
var list = []

for(var i = 0; i < maxNum; i++) {
  var tempRowData = JSON.parse(JSON.stringify(rowData))
  list.push(tempRowData)
}

function stringifyList() {
  list = JSON.stringify(list)
}

function gc() {
  list = null
}

运行后内存对比

10W条 json对象占用内存

10W条 json字符串占用内存

100W条 json对象占用内存

10W条 json字符串占用内存

💡
注意:在截图内存占用量之前,需要手动点击浏览器的垃圾回收。如下图:

表格统计结果如下

json对象

Json字符串

10w

4.1MB

11.9MB

100w

34.1MB

111MB

💡
结论:内存占用json字符串远高于json对象,几乎是json对象的3倍。

那么真的是 “json字符串对内存占用远高于json对象” 吗?

答案是:不一定

将上面的部分代码改成如下:

var rowData = {
  num: 1
}

var maxNum = 1000000
var list = []
...(同上)

运行后内存对比

10W条 json对象占用内存

10W条 json字符串占用内存

100W条 json对象占用内存

100W条 json字符串占用内存

1000W条 json对象占用内存

1000W条 json字符串占用内存

表格统计结果如下

json对象

Json字符串

10w

2.9MB

1.9MB

100w

22.1MB

10MB

1000w

220MB

101MB

💡
结论:此时结论相反了。内存占用 json对象此时更多,基本上是json字符串的2倍

以上代码还测试了其他复杂度的对象,得出如下最终结论

💡
最终结论:json对象只有在极简单的情况(简单到对象不同的字符不能超过10个左右),占用内存才更大。否则都是json对象占用内存更小。
💡
所以在前端缓存时,推荐使用对象形式缓存
思考:以上的研究为什么会有以上的结果?