在一个优化超大数据量性能问题上,让我产生了研究该讨论话题。
话不多说,直接上代码。
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对象占用内存更小。
💡
所以在前端缓存时,推荐使用对象形式缓存
❔
思考:以上的研究为什么会有以上的结果?