在javascript中以位字段存储和操作的哪种方式最快? (200k +位)

时间:2012-12-26 20:40:17

标签: javascript cordova bit-manipulation bit-fields

我正在分析我的javascript代码,该代码旨在用于Android(PhoneGap)上的嵌入式浏览器。

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

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

比我制作好时尚阵容的bools。这增加了内存使用量(但是对于我的代码,整个PhoneGap框架在Android上仍然不到15兆)。分析向我展示了我的算法的第一步 - 将位域的所有元素设置为1(简单的循环) - 占用执行时间的一半(在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中存储和操作大型位域?

2 个答案:

答案 0 :(得分:3)

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

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

I've added a few more test cases to the jsperf page that Asad linked in his comment。到目前为止,我的浏览器中最快(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);
}

答案 1 :(得分:2)

为什么要先预先填充数组!使用undefined对您有利。请记住,undefined充当 falsey 值。因此,当您进行布尔检查时,它将完全像0 / false。

var myArray = new Array(200000);

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

因此,当您以这种方式初始化数组时,没有理由预先填充!这意味着没有额外的处理并利用稀疏阵列!