內存
在很久之前,我就想查看一個對象在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類型的,同樣是一個字符,中文占用的字節和英文不一樣,對象的大小也沒計算,但是還可以用