79 lines
1.9 KiB
JavaScript
79 lines
1.9 KiB
JavaScript
/*
|
|
|
|
sizeof.js
|
|
|
|
A function to calculate the approximate memory usage of objects
|
|
|
|
Created by Stephen Morley - http://code.stephenmorley.org/ - and released under
|
|
the terms of the CC0 1.0 Universal legal code:
|
|
|
|
http://creativecommons.org/publicdomain/zero/1.0/legalcode
|
|
|
|
*/
|
|
|
|
/* Returns the approximate memory usage, in bytes, of the specified object. The
|
|
* parameter is:
|
|
*
|
|
* object - the object whose size should be determined
|
|
*/
|
|
function sizeof(object){
|
|
|
|
// initialise the list of objects and size
|
|
var objects = [object];
|
|
var size = 0;
|
|
|
|
// loop over the objects
|
|
for (var index = 0; index < objects.length; index ++){
|
|
|
|
// determine the type of the object
|
|
switch (typeof objects[index]){
|
|
|
|
// the object is a boolean
|
|
case 'boolean': size += 4; break;
|
|
|
|
// the object is a number
|
|
case 'number': size += 8; break;
|
|
|
|
// the object is a string
|
|
case 'string': size += 2 * objects[index].length; break;
|
|
|
|
// the object is a generic object
|
|
case 'object':
|
|
|
|
// if the object is not an array, add the sizes of the keys
|
|
if (Object.prototype.toString.call(objects[index]) != '[object Array]'){
|
|
for (var key in objects[index]) size += 2 * key.length;
|
|
}
|
|
|
|
// loop over the keys
|
|
for (var key in objects[index]){
|
|
|
|
// determine whether the value has already been processed
|
|
var processed = false;
|
|
for (var search = 0; search < objects.length; search ++){
|
|
if (objects[search] === objects[index][key]){
|
|
processed = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
// queue the value to be processed if appropriate
|
|
if (!processed) objects.push(objects[index][key]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// return the calculated size
|
|
return size;
|
|
|
|
}
|
|
module.exports = {
|
|
|
|
f: function (obj) {
|
|
return sizeof(obj)
|
|
}
|
|
}
|