近似计算一个对象在js占用内存
2024-09-05 05:39:53
内存
在很久之前,我就想查看一个对象在JS里占用多少内存了,直到最近由于线上使用了需要计算从服务端传输数据的大小,让这个需求尤为强烈。
预备知识
我们现在使用的js是高级语言,它在内存细节之上建立一个抽象层,目前我们接触到的,就是变量,变量的占用内存是固定了,语言规范声明的,但是由于实现解释器,可能一个类型的变量占用内存,会稍规范多一些,这里我们可以先忽略,这样,我们就可以按照规范定义的变量内存大小,来计算一个变量占用的内存了
js中的类型
undefined
null
boolean
number
string
object(区分普通数组和对象)
npm - object-sizeof
按照官方定义的数据类型大小,npm有一个包遍历对象,然后依次计算每个属性占用的内存,求和,就能得到对象的近似大小
npm install object-sizeof
var sizeof = require('object-sizeof')
// 2B per character, 6 chars total => 12B
console.log(sizeof({abc: 'def'}))
// 8B for Number => 8B
console.log(sizeof(12345))
var param = {
'a': 1,
'b': 2,
'c': {
'd': 4
}
}
// 4 one two-bytes char strings and 3 eighth-bytes numbers => 32B
console.log(sizeof(param))
首先安装object-sizeof,然后引入即可得到对象大致大小
object-sizeof缺陷
好奇的我看了这个包的源码
function sizeOfObject (object) {
if (object == null) {
return 0
}
var bytes = 0
for (var key in object) {
if (!Object.hasOwnProperty.call(object, key)) {
continue
}
bytes += sizeof(key)
try {
bytes += sizeof(object[key])
} catch (ex) {
if (ex instanceof RangeError) {
// circular reference detected, final result might be incorrect
// let's be nice and not throw an exception
bytes = 0
}
}
}
return bytes
}
function sizeof (object) {
if (Buffer.isBuffer(object)) {
return object.length
}
var objectType = typeof (object)
switch (objectType) {
case 'string':
return object.length * ECMA_SIZES.STRING
case 'boolean':
return ECMA_SIZES.BOOLEAN // 4
case 'number':
return ECMA_SIZES.NUMBER //8
case 'object':
if (Array.isArray(object)) {
return object.map(sizeof).reduce((acc, curr) => acc + curr, 0)
} else {
return sizeOfObject(object)
}
default:
return 0
}
}
首先在这里,null和undefined的内存被标记为0,这里是不正确的,然后是string类型的,同样是一个字符,中文占用的字节和英文不一样,对象的大小也没计算,但是还可以用
最新文章
- 先有 Mac 还是先有银元?
- 代码片段添加智能提示,打造一款人见人爱的ORM框架
- 谈谈html5存储之IndexdDB
- [SLAM] GMapping SLAM源码阅读(草稿)
- phpcmsv9 标题颜色显示问题
- 把Chrome浏览器变成文本编辑器
- day04-java-循环结构(while、do-while、for)
- jQuery判断某个元素是否存在某个样式
- IE专用CSS,最全的CSS hack方式一览
- Hive2.0函数大全(中文版)
- 【前端】向blog或网站中添加语法高亮显示代码方法总结
- 出错信息:Incorrect string value: '\xE4\xBD\xA0\xE5\xA5\xBD' for column 'username'
- JavaWeb 乱码问题终极解决方案!
- 3.2 MathType插入竖省略号
- Java Web开发总结(三) —— request接收表单提交中文参数乱码问题
- react native 之 事件监听 和 回调函数
- unity小地图制作___按比例尺图标布局
- 分享10款效果惊艳的HTML5图片特效
- pycharm跳到指定的行
- mysql--------命令来操作表
热门文章
- 打包一个python解释器
- 【LOJ2402】「THUPC 2017」天天爱射击 / Shooting(整体二分)
- 洛谷 P5658 括号树
- [开源] FreeSql 配套工具,基于 Razor 模板实现最高兼容的生成器
- 监控ckeditor内容变化,删除编辑器内图片,ueditor同样适用
- Python连载46-XML文件修改创建
- yii2自定义验证规则
- Bag of Tricks for Image Classification with Convolutional Neural Networks
- 使用VS2017+WDK10开发xp驱动
- 用 Python 带你看各国 GDP 变迁