在Javascript中,在两个ArrayBuffers中对元素对进行位操作的最有效方法是什么?

14

我有两个JavaScript的ArrayBuffer;每个包含512位数据。我想对这两个数组进行异或比较,并将结果存储在第三个数组中。

目前,我正在循环遍历缓冲区中的元素。在下面的代码中,“distance”是一个整数,“feat_a1”和“feat_b1”是512位长度的ArrayBuffer。

for(var d1=0; d1<512; d1++){
  distance += feat_b1[d1] ^ feat_a1[d1];
}

有没有更有效的方法来比较这两个数组的配对?


1
我不这么认为。根据你的环境,你可以使用while来挤出更多性能,但需要进行测试。即使展开循环,在最近的浏览器中也可能会变慢,因为它们进行了优化。 - Xotic750
距离(我假设是你的第三个数组)是否已经包含数据?如果没有,根据实现的方式,使用一个简单的'='可能会节省一点时间(即使在大数据集上也只是几分之几毫秒的级别),因为从技术上讲,它每个操作都少了一个内存引用。 - Matthew Herbst
你需要这个是干什么的?当你说想要对它们进行异或运算时,我本来以为“distance”也是另一个“ArrayBuffer”… 另外,它是512位(你如何逐个访问它们?)还是512字节?如果你能够包含初始化“feat_b1”和“feat_a1”的代码,那就太好了。 - Bergi
感谢 DwB 的编辑。 - freakTheMighty
再说一遍:你在做什么? distance 代表什么,是某种按位编辑距离吗?“求和位”是什么意思? - Bergi
显示剩余3条评论
1个回答

1
据我所了解,您不能直接使用arrayBuffer[i],必须将其传递给某些容器(例如Int8Array)。我制作了下一个示例http://jsfiddle.net/mLurz/,尝试了来自this list的不同类型化数组,并且Uint32Array显示出最佳性能。
var i;
var dist = 0;
var max = Math.pow(2,32);
var buf1 = new ArrayBuffer(1024);
var x = new Uint32Array(buf1);
for (i = 0; i < 256; ++i) {
    x[i] = Math.random()*max;
}

var buf2 = new ArrayBuffer(1024);
var y = new Uint32Array(buf2);
for (i = 0; i < 256; ++i) {
    y[i] = Math.random()*max
}

console.time('Uint32Array');
for (var j = 0; j < 1000000; ++j) {
    for (i = 0; i < 256; ++i) {
        dist += y[i]^x[i];
    }
}
console.timeEnd('Uint32Array');

抱歉,我想我已经在使用一个类型化数组了。我觉得我对我的用语不准确。我猜测类型化数组提供了一个ArrayBuffer的掩码? - freakTheMighty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接