January 6, 2015

 

Computate size of Javascript object

 

The computation of the object size of Javascript needs grasping all the properties which compose an object. All the properties which compose an object can be gotten by the processing of "for(var key in obj)console.log(key);".

To the type of each property, I add up the size that I found and get size of the whole object. If the property is a primitive types (Number type, String type, Boolean type), it is possible to add up simply but at the reference types (Array type, Object type), the primitive type doesn't appear when not seeing the lower layer.

The reference type property distinguishes between inner [[Class]] property of the object using "Object.prototype.toString". It processed a recursion in the object when the inner property of the object was [object Array] and the value of the object was [object Object].

When the inner property was an object except these, it thought as the binary data and it got the size. Also, the Function type serialized and got the size.

 

Source code

function objectSize(data,tb){
	var size=0;
	for( var key in data ) {
		var objType=typeof data[key];

		var sp="";
		for(var i=0;i<tb*4;i++)sp+=" ";
		if(objType=="function")console.log(sp+"type="+objType+" key="+key+" size="+(new String(data[key])).length*2);
		else console.log(sp+"type="+objType+" key="+key+" val="+data[key]);

		size+=key.length*2;// key size
		if(!data[key])continue;// value is null

		if(objType=="boolean")size+=4;
		else if(objType=="number")size+=8;
		else if(objType=="string")size+=data[key].length*2;
		else if(objType=="function")size+=(new String(data[key])).length*2;
		else if(objType=="object"){
			var objClass=Object.prototype.toString.call(data[key]);
			if(objClass=="[object Array]"||data[key]=="[object Object]"){
				tb++;
				size+=objectSize(data[key],tb);
				tb--;
			}
			else{// binary data
				size+=data[key].length;
			}
		}
	}
	return size;
}

 

Calculation example (contains function type)

function len(s){
	return s.length;
}
var fam={
	"name" : "Marry",
	"age" : 48,
	"children" : [ {
		"name" : "John",
		"age" : 25,
		"interests" : ["running","programming"],
		"hasChildren" : 1
	}, {
		"name" : "Bob",
		"age" : 17,
		"interests" : "fishing",
		"hasChildren" : null,
		"func" : len,
		"tel" : {"home" : "000-111-222", "mobile" : "000-999-888"}
	} ]
};
console.log("size="+objectSize(fam,0));

type=string key=name val=Marry
type=number key=age val=48
type=object key=children val=[object Object],[object Object]
	type=object key=0 val=[object Object]
		type=string key=name val=John
		type=number key=age val=25
		type=object key=interests val=running,programming
			type=string key=0 val=running
			type=string key=1 val=programming
		type=number key=hasChildren val=1
	type=object key=1 val=[object Object]
		type=string key=name val=Bob
		type=number key=age val=17
		type=string key=interests val=fishing
		type=object key=hasChildren val=null
		type=function key=func size=72
		type=object key=tel val=[object Object]
			type=string key=home val=000-111-222
			type=string key=mobile val=000-999-888
object size=402

 

Calculation example (contains binary data)

var buf = new Buffer('0123abcd', 'utf-8');
var param = {
	'a': 1,
	'b': "2",
	'c': {
		'd': true,
		'e': flase,
		'f': buf
	}
};
console.log("size="+objectSize(param,0));

type=number key=a val=1
type=string key=b val=2
type=object key=c val=[object Object]
	type=boolean key=d val=true
	type=boolean key=e val=false
	type=object key=f val=0123abcd
object size=52

 

wrote by T. Osaka