惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

云风的 BLOG
云风的 BLOG
C
Cyber Attacks, Cyber Crime and Cyber Security
Recent Announcements
Recent Announcements
爱范儿
爱范儿
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Security Latest
Security Latest
J
Java Code Geeks
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Cisco Talos Blog
Cisco Talos Blog
Apple Machine Learning Research
Apple Machine Learning Research
C
Check Point Blog
T
Threat Research - Cisco Blogs
I
Intezer
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
WordPress大学
WordPress大学
Engineering at Meta
Engineering at Meta
腾讯CDC
Google DeepMind News
Google DeepMind News
Project Zero
Project Zero
T
Tenable Blog
V
Visual Studio Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
Spread Privacy
Spread Privacy
GbyAI
GbyAI
T
Tailwind CSS Blog
P
Palo Alto Networks Blog
Microsoft Security Blog
Microsoft Security Blog
Scott Helme
Scott Helme
Hugging Face - Blog
Hugging Face - Blog
NISL@THU
NISL@THU
Blog — PlanetScale
Blog — PlanetScale
G
GRAHAM CLULEY
K
Kaspersky official blog
T
The Exploit Database - CXSecurity.com
S
Schneier on Security
P
Proofpoint News Feed
S
SegmentFault 最新的问题
P
Proofpoint News Feed
P
Privacy & Cybersecurity Law Blog
The Hacker News
The Hacker News
博客园 - 【当耐特】
Cyberwarzone
Cyberwarzone
L
LangChain Blog
Stack Overflow Blog
Stack Overflow Blog
V
Vulnerabilities – Threatpost
H
Help Net Security
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Last Week in AI
Last Week in AI
博客园 - 叶小钗

博客园 - Liaofy

前端新范式:用 AI 提效开发,用 E2E 保证迭代质量 把SPA的加载速度提升一倍,有没有搞头? 使用mumu模拟器抓包 andriod app 如何在本地给 vue-router4 扩展功能? Vue3 路由优化,使页面初次渲染效率翻倍 【eslint 插件开发】禁用 location 跳转外部链接 vue 项目使用 charles 代理线上页面到本地后显示404 高扩展弹出层组件设计实现(H5&小程序) 轻松搞懂POST与PUT的区别 vite(or rollup) 实现 webpackChunkName webapp项目架构畅想(vue3).md vite试玩:老项目启动从6分钟到秒开 修剪AST树减少webapck打包尺寸 【uniapp】改善中大型uniapp小程序项目开发体验 vscode 调试 webpack 打包 5分钟,搞清 Unicode 与 UTF-8 的区别 deAsync.js 真正让异步变同步 盘的转——使用缓动函数完成动画 多个请求间断失败,如何优雅处理?
避免使用单个数字作为对象的key
Liaofy · 2022-08-11 · via 博客园 - Liaofy

背景

同事开发一个表格,一次性渲染5w+条数据。但在渲染某些数据时,内存暴增,经排查,发现其数据用了数字90作为对象的key。

分析

我们猜测,当用数字作为对象的key时,数据将以数组的形式进行存储。由于其中拥有大量的节点(空节点也要占据内存),导致内存飙升。

使用chrome浏览器无痕模式进行验证,在控制台输入如下测试代码,观察内存变化:

let a = {}
let indexValue = 200

for(var i = 0; i < 500; i++) {
    a[i] = {}
    for (var j = 0; j < 500; j++) {
        a[i][j] = {}
        a[i][j][indexValue] = {}
    }
}

通过不断改变indexValue的值,得到indexValue和内存占用的关系如下:

indexValue memory size(M)
9 50
90 171
200 336
500 786
600 936
1023 1572
1024 35
1028 35
9999 35

可以看到,随着indexValue的不断增加,内存也不断升高,直到indexValue值为1023时内存占用达到顶峰,随后立即断崖式下降。

v8 的官网文章fast-properties也有提及。

结论

当我们使用对象存储数据时,不要用数字作用对象的key,以避免内存浪费。

更进一步

如上所述,使用超过1023的数字作为对象key,好像也可以呢。现在我们使用大数字9999和字符串absdfsd作为对象key,分别测量它们的内存占用情况:

let a = {}

for(var i = 0; i < 10; i++) {
    a[i] = {9999: {}}
}

使用数字9999内存占用558 + 796 + 408 = 1762b:

let a = {}

for(var i = 0; i < 10; i++) {
    a[i] = {absdfsd: {}}
}

使用字符串absdfsd内存占用 632 + 468 + 76 + 20 = 1196b:

显然,字符串作为key更省内存。原因是,使用数字作为对象key,数据内部会额外保存一个数组,如下图。随着循环次数的增加,字符串省内存的优势会更加明显。

PS. 再来看看动态key,使用如下测试代码,内存占用情况又如何呢:

let a = {}

for(var i = 0; i < 5000; i++) {
    a[i] = {[9999 + i]: {}}
}
let a = {}

for(var i = 0; i < 5000; i++) {
    a[i] = {['abcd' + i]: {}}
}

这里就不截图了,有兴趣的同学可以自己尝试下。直接给结果:9999 + i => 798,232abcd + i => 890,132,可以看到,两者占用的内存差别较小,数字key反而更省内存。

引用