근사 계산 대상 이 js 에서 메모 리 를 차지 하고 있 음

2723 단어
메모리
오래 전부터 한 대상 이 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 - size of 를 설치 한 후 도입 하면 대상 의 크기 를 얻 을 수 있 습 니 다.
객체 크기 의 결함
궁금 해서 제 가 이 가방 의 소스 코드 를 봤 어 요.
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 형식 입 니 다. 똑 같은 문자 입 니 다. 중국어 가 사용 하 는 바이트 와 영어 가 다 르 고 대상 의 크기 도 계산 하지 않 았 지만 사용 할 수 있 습 니 다.
다음으로 전송:https://www.cnblogs.com/sefaultment/p/11518625.html

좋은 웹페이지 즐겨찾기