例如,在内存中存储对一个HTML元素的引用时,与存储字符串或数字相比,内存消耗的差异有多大?

const el = document.getElementById("myEl");

const myCache = new Set()

// store reference to element
myCache.add(el);

// VS store a random string
myCache.add("someStr");

// VS store a random number
myCache.add(0);

这在内存中看起来如何,他们中最友好的内存解决方案是什么.

推荐答案

让我们先看看Chrome堆转储的内存消耗情况.

A Set of 1509 strings each of 144 characters consumes 231776 bytes: enter image description here

A Set of 1509 strings each of 72 characters consumes 111056 bytes: enter image description here

A Set of 1509 strings each of 36 characters consumes 50696 bytes: enter image description here

A Set of 1509 elements consumes 20516 bytes: enter image description here

A Set of 1509 numbers also consumes 20516 bytes: enter image description here

因此,字符串集的大小随每个项目长度的大小而变化,但内存大小对于元素和数量是一致的.

现在来回答你的问题.根据用例的不同,最高效的内存方法可能会有所不同.

A set of element将实际存储元素引用.JS中对象引用的大小为8字节.

元素引用集合可能看起来是消耗一致存储器的解决方案,因为该集合仅保存对该元素的引用,并且该元素的存储器已经被分配,因为它是DOM的一部分.因此,没有什么真正的增长.

但是,使用元素引用创建集合的一个问题是,如果在从DOM中删除元素之后不删除元素引用,由于集合中保留的元素引用,它将不断消耗为被删除的元素分配的内存.如果页面上的添加/删除元素非常频繁,并且Set包含所有元素引用,则可能会导致内存泄漏.在这种情况下,我们必须从集合中删除已删除的元素引用.Element.isConnected是一个布尔属性,如果元素仍然附加到DOM,则返回TRUE,如果从DOM中删除元素,则返回FALSE.

A set of strings时,字符串将存储在堆中,而集合将保存它们的引用.最终,这种方法的内存消耗将取决于您要添加的字符串的大小.

现在,对于a set of 100s,数字也将存储在堆中,集合将保存它们的引用.JS中的一个数字需要8个字节.所以在这里你也可以得到一致的尺寸.

Conclusion Based on same size set for different data types

  • Set只存储您要添加到其中的项的引用.因此,差异主要是由于堆中项的大小造成的.
  • 如果你有小长度的弦,你可以用它.
  • 如果您的用例适合元素方法并正确处理内存泄漏,则可以 Select 元素集方法.
  • A set of number can be a decent choice in most cases.

Javascript相关问答推荐

如果被1个Phaser JS抵消,我的倾斜碰撞

vue3类型脚本中可能未定义对象''

添加/删除时React图像上传重新渲染上传的图像

如何通过在提交时工作的函数显示dom元素?

React:未调用useState变量在调试器的事件处理程序中不可用

从PWA中的内部存储读取文件

Angular material 拖放堆叠的牌副,悬停时自动展开&

Promise Chain中的第二个useState不更新

如何让npx在windows中运行js脚本?

try 使用javascript隐藏下拉 Select

如何将innerHTML字符串修剪为其中的特定元素?

如何在Svelte中从一个codec函数中调用error()?

Webpack在导入前混淆文件名

使用NextJS+MongoDB+Prisma ORM获取无效请求正文,无法发布错误

如何在JAVASCRIPT中临时删除eventListener?

如何 for each 输入动态设置输入变更值

按什么顺序接收`storage`事件?

Phaser3 preFX addGlow不支持zoom

react 路由如何使用从加载器返回的数据

在ChartJS中使用spanGaps时,是否获取空值的坐标?