JavaScript 객체가 차지하는 크기를 알고 싶습니다.
다음 기능을 수행하십시오.
function Marks(){
this.maxMarks = 100;
}
function Student(){
this.firstName = "firstName";
this.lastName = "lastName";
this.marks = new Marks();
}
이제 다음을 인스턴스화합니다 student
.
var stud = new Student();
내가 같은 일을 할 수 있도록
stud.firstName = "new Firstname";
alert(stud.firstName);
stud.marks.maxMarks = 200;
기타
이제 stud
객체는 메모리에서 어느 정도 크기를 차지합니다. 데이터와 더 많은 개체가 있습니다.
stud
개체가 얼마나 많은 메모리를 차지 하는지 어떻게 알 수 있습니까? sizeof()
JavaScript 와 같은 것 ? 와 같은 단일 함수 호출에서 찾을 수 있다면 정말 좋을 것 sizeof(stud)
입니다.
몇 달 동안 인터넷을 검색해 봤는데 답을 찾을 수 없었습니다.
답변
원래 답변 에서 코드를 리팩터링했습니다 . 재귀를 제거하고 가정 된 존재 오버 헤드를 제거했습니다.
function roughSizeOfObject( object ) {
var objectList = [];
var stack = [ object ];
var bytes = 0;
while ( stack.length ) {
var value = stack.pop();
if ( typeof value === 'boolean' ) {
bytes += 4;
}
else if ( typeof value === 'string' ) {
bytes += value.length * 2;
}
else if ( typeof value === 'number' ) {
bytes += 8;
}
else if
(
typeof value === 'object'
&& objectList.indexOf( value ) === -1
)
{
objectList.push( value );
for( var i in value ) {
stack.push( value[ i ] );
}
}
}
return bytes;
}
답변
Chrome 힙 프로파일 러를 사용하면 객체 메모리 사용을 검사 할 수 있습니다.
까다로울 수있는 추적에서 개체를 찾을 수 있어야합니다. 객체를 Window 전역에 고정하면 “컨테이너”목록 모드에서 쉽게 찾을 수 있습니다.
첨부 된 스크린 샷에서 창에 “testObj”라는 객체를 만들었습니다. 그런 다음 프로파일 러에 위치하여 (기록한 후) 개체의 전체 크기와 “보존 크기”아래의 모든 개체를 보여줍니다.
위의 스크린 샷에서 객체의 크기는 60으로 유지됩니다. 단위는 바이트라고 생각합니다.
답변
방금 비슷한 (ish) 문제를 해결하기 위해 이것을 썼습니다. 그것은 당신이 찾고있는 것을 정확하게하지 않습니다. 즉, 인터프리터가 객체를 저장하는 방법을 고려하지 않습니다.
그러나 V8을 사용하는 경우 멋진 프로토 타이핑 및 숨겨진 클래스가 오버 헤드의 대부분을 차지하므로 상당히 괜찮은 근사치를 제공해야합니다.
function roughSizeOfObject( object ) {
var objectList = [];
var recurse = function( value )
{
var bytes = 0;
if ( typeof value === 'boolean' ) {
bytes = 4;
}
else if ( typeof value === 'string' ) {
bytes = value.length * 2;
}
else if ( typeof value === 'number' ) {
bytes = 8;
}
else if
(
typeof value === 'object'
&& objectList.indexOf( value ) === -1
)
{
objectList[ objectList.length ] = value;
for( i in value ) {
bytes+= 8; // an assumed existence overhead
bytes+= recurse( value[i] )
}
}
return bytes;
}
return recurse( object );
}
답변
때로는 이것을 사용하여 서버에서 클라이언트로 갈 수있는 정말로 큰 객체를 표시합니다. 메모리 사용 공간을 나타내지 않습니다. 보내거나 저장하는 데 드는 비용을 대략적으로 알려줍니다.
또한 느리지 만 개발자 만 있습니다. 그러나 한 줄의 코드로 야구장 답변을 얻는 데 유용했습니다.
roughObjSize = JSON.stringify(bigObject).length;
답변
다음은이 문제에 대한 약간 더 컴팩트 한 솔루션입니다.
const typeSizes = {
"undefined": () => 0,
"boolean": () => 4,
"number": () => 8,
"string": item => 2 * item.length,
"object": item => !item ? 0 : Object
.keys(item)
.reduce((total, key) => sizeOf(key) + sizeOf(item[key]) + total, 0)
};
const sizeOf = value => typeSizes[typeof value](value);
답변
이 객체를 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));
답변
이것은 해키 방법이지만 다른 숫자로 두 번 시도했지만 일관된 것처럼 보입니다.
당신이 할 수있는 일은 원하는 종류의 1 ~ 2 백만 개의 객체와 같은 엄청난 수의 객체를 할당하고 할당하는 것입니다. 가비지 수집기에서 객체를 해제하지 못하게하기 위해 객체를 배열에 넣습니다 (배열로 인해 약간의 메모리 오버 헤드가 추가되지만 메모리에있는 객체에 대해 걱정할 경우 문제가되지 않기를 바랍니다) , 당신은 어딘가에 저장합니다). 할당 전후에 경고를 추가하고 각 경고에서 Firefox 프로세스가 얼마나 많은 메모리를 사용하는지 확인하십시오. 테스트를 통해 페이지를 열기 전에 새 Firefox 인스턴스가 있는지 확인하십시오. 페이지를 열고 “이전”경고가 표시된 후 메모리 사용량을 확인하십시오. 경고를 닫고 메모리가 할당 될 때까지 기다리십시오. 오래된 메모리에서 새 메모리를 빼고 할당량으로 나눕니다.
function Marks()
{
this.maxMarks = 100;
}
function Student()
{
this.firstName = "firstName";
this.lastName = "lastName";
this.marks = new Marks();
}
var manyObjects = new Array();
alert('before');
for (var i=0; i<2000000; i++)
manyObjects[i] = new Student();
alert('after');
컴퓨터에서이 작업을 시도했는데 “이전”경고가 표시 될 때 프로세스에 48352K의 메모리가있었습니다. 할당 후 Firefox에는 440236K의 메모리가있었습니다. 200 만 할당의 경우 각 개체 당 약 200 바이트입니다.
나는 1million 할당으로 다시 시도했고 결과는 비슷했습니다 : 객체 당 196 바이트 (2mill의 여분의 데이터가 Array에 사용되었다고 가정).
따라서 여기 도움이 될만한 해키 방법이 있습니다. JavaScript는 “sizeof”메소드를 제공하지 않습니다. 각 JavaScript 구현은 다릅니다. 예를 들어 Chrome에서 동일한 페이지는 각 객체에 대해 약 66 바이트를 사용합니다 (적어도 작업 관리자에서 판단).