近似計算一個對象在js占用內存


內存

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM