内存中函数的大小

时间:2014-11-11 03:04:30

标签: javascript function memory

我一直在使用sizeof.js在javascript中探索各种对象的大小。当我检查函数的大小时,无论函数包含多少行代码,我都会获得零字节。例如:

alert(sizeof(
  function(){
    return 1;
  }
));

返回零大小。即使我给函数多行代码,我得到的字节大小为零。存储字符串所需的内存量取决于字符串的长度。但是函数的复杂性或大小似乎是无关紧要的。为什么会这样?

4 个答案:

答案 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所做的只是总结了对象的可迭代属性的大小或标量值的普通大小。它使用固定的已知大小的标量值。显然,结果非常不准确。

它无法计算函数的大小,因为:

  1. 依赖于实现
  2. 它甚至可能在运行时变化
  3. ECMAScript未声明必须如何实现功能

答案 2 :(得分:1)

website for sizeof.js说:&#34;虽然JavaScript不包含查找对象确切内存使用情况的机制,但sizeof.js提供了一个确定近似数量的函数使用的记忆。&#34; (强调我的。)

结果是&#34;近似&#34;因为它受浏览器提供的信息的限制,浏览器显然没有提供功能的大小信息。这并不奇怪,因为函数的代码 - 浏览器执行的实际字节码或机器代码 - 是一个在程序中看不到的实现细节。功能基本上是一个黑盒子。

答案 3 :(得分:0)

确定函数持有多少内存太难了

该函数中的所有局部变量都需要考虑,甚至需要考虑clousure

@Arun指出,函数不在sizeof.js中计算