7

我认为浏览器之间可能存在差异,

但是我如何找出一个数组或它的一个元素在 Javascript 中占用了多少内存?

我想弄清楚使用类型化数组时节省了多少空间。

提前致谢!

4

1 回答 1

5

这取决于很多方面。

  • 用于存储变量的引用的长度可以在大小上有所不同(如果您不使用关联数组,它实际上在 JS 中并不存在,但这是一个不同的讨论)。
  • 物品本身的大小也可能不同。基本上,用于存储某种类型对象的二进制表示是构成内存的原因。
    • 8 位 int 使用 1 个字节。
    • 16 位 int 使用 2 个字节。
    • 字符串中的字符使用 2 或 4 个字节(因为 UTF-16)。
  • 如果您想更好地了解大小/速度/执行时间,我认为唯一准确的方法是使用浏览器附带的分析工具,或使用 FireBug 等插件。

现实是不同的。您不必担心客户端存储。至少不是这样。您真正需要的唯一特定于内存的控制是memoization。除此之外,你需要做的就是清理你的痕迹,可以这么说。如果您在 OOP 环境中,请确保在完成后始终实例化引用并将您的和引用归delete空。COMDOM

 

如果您想清空集合(数组),只需使用delete运算符。如果您没有将集合定义为实例属性,而是将var其定义为上下文变量,请使用myArray.length = 0;它将delete整个存储在数组中。

 

如果您正在处理大型集合,则直接分配比使用该Array.prototype.push();方法更快。myArray[i] = 0;myArray.push(0);根据 jsPerf.com测试用例更快。

 

遍历数组所需的时间可能会根据您引用数组长度的方式以及您使用的 Internet 浏览器而发生很大变化。

// Option 1
for (var i = 0; i < someArray.length; i++) {
    // do something;
};
// Option 2
var l =  myArray.length;
for(var i = 0; i < l; i++) {
    // do something
};
// Option 3
for (var i = 0, ii = someArray.length; i < ii; i++) {
    // do something;
};

上述测试用例可在此处获得。

截至2015年6月6日,相对速度如下:

+--------+------------+---------------+----------------------+
| Option | Firefox    | Google Chrome | Internet Explorer 11 |
+--------+------------+---------------+----------------------+
| 1      | Fastest    | 0.35% Slower  | 46% Slower           |
| 2      | 21% Slower | 0.15% Slower  | 0.09% Slower         |
| 3      | 21% Slower | Fastest       | Fastest              |
+--------+------------+---------------+----------------------+

 

定义数组时,绝对没有必要指定长度,尤其是在进行延迟初始化时。

// Doing this is pointless in JS. It will result in an array with 100 undefined values.
var a = new Array(100);

// Not even this is the best way.
var a = new Array();

// Using the array literal is the fastest and easiest way to do things.
var a = [];

数组定义的测试用例可在此处获得。

于 2012-12-17T14:42:05.757 回答