2

我正在分析我打算在 Android (PhoneGap) 上的嵌入式浏览器上使用的 javascript 代码。

基本上,我的计算需要一个非常大的位域(200k+ 位)。

我试图将它们放入无符号整数数组中,每个项目存储 32 位 - 这确实减少了内存使用量,但执行时间非常慢(在现代 PC 上简单迭代和反转位域中的所有位超过 30 秒!)

比我制作好的老式布尔数组。这增加了内存使用量(但我的代码周围的整个 PhoneGap 框架在 Android 上仍然不到 15 兆)。分析向我展示了我算法的初始步骤 - 将位域的所有元素设置为 1(简单的 for 循环) - 需要一半的执行时间(在 PC 上约为 1.5 秒,在 Android 上超过几分钟)。我可以重写我的代码,所以默认值是 0 而不是 1(反转所有条件),但我仍然不知道如何将这么大的数组快速设置为 0。

根据要求编辑添加我的代码:

var count = 200000;
var myArr = [];

myArr.length = count;
for(var i = 0; i < count ; i++)
    myArr[i] = true;

有人可以指出我如何清除非常大的数组,或者有没有更快的方法来存储和操作 javascript 中的大位域?

4

2 回答 2

3

看看这是否是创建数组的更快方法:

var myArray = [true];
var desiredLength = 200000;
while (myArray.length < desiredLength) {
    myArray = myArray.concat(myArray);
}
if (myArray.length > desiredLength) {
    myArray.splice(desiredLength);
}

jsperf我在Asad 在他的评论中链接的页面中添加了更多测试用例。到目前为止,我的浏览器(Mac OS X 10.8.2 上的 Chrome 23.0.1271.101)中最快的是这个:

var count = 200000;
var myArr = [];
for (var i = 0; i < count; i++) {
  myArr.push(true);
}
于 2012-12-26T21:25:20.383 回答
2

为什么首先要预先填充数组!利用undefined你的优势。请记住,未定义充当虚假值。因此,当您进行布尔检查时,它的行为与 0/false 完全相同。

var myArray = new Array(200000);

if (myArray[1]) {   
  //I am a truthy value
} else {
  //I am a falsey value
}

所以当你以这种方式初始化数组时,没有理由预填充!这意味着无需额外处理并利用稀疏数组!

于 2012-12-27T14:08:37.380 回答