我一直在使用sizeof.js
在javascript中探索各种对象的大小。当我检查函数的大小时,无论函数包含多少行代码,我都会获得零字节。例如:
alert(sizeof(
function(){
return 1;
}
));
返回零大小。即使我给函数多行代码,我得到的字节大小为零。存储字符串所需的内存量取决于字符串的长度。但是函数的复杂性或大小似乎是无关紧要的。为什么会这样?
答案 0 :(得分:2)
如果查看sizeof库的源代码,可以发现sizeof库中没有处理对象类型function
,因此默认返回大小0
。
/*
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;
}
您可以看到size
已使用值0
初始化,并且function
语句中未处理switch
类型,因此它始终会返回0
对于一个功能。
答案 1 :(得分:2)
sizeof.js所做的只是总结了对象的可迭代属性的大小或标量值的普通大小。它使用固定的已知大小的标量值。显然,结果非常不准确。
它无法计算函数的大小,因为:
答案 2 :(得分:1)
website for sizeof.js说:&#34;虽然JavaScript不包含查找对象确切内存使用情况的机制,但sizeof.js提供了一个确定近似数量的函数使用的记忆。&#34; (强调我的。)
结果是&#34;近似&#34;因为它受浏览器提供的信息的限制,浏览器显然没有提供功能的大小信息。这并不奇怪,因为函数的代码 - 浏览器执行的实际字节码或机器代码 - 是一个在程序中看不到的实现细节。功能基本上是一个黑盒子。
答案 3 :(得分:0)