2

我有一个代表位的类,它用于ArrayBuffers存储二进制数据。我试图弄清楚是否有更快的方法来执行xorbetween two ArrayBuffers

注意的长度ArrayBuffers通常小于 10 个字节。但是由于xor操作执行了数百万次,如果不是数十亿次,那么每毫秒节省的时间都很重要。

// my current/simple method
// assume 'buf1', 'buf2' & 'result' are ArrayBuffers
for (var i=0; i<result.length; i++) {
  result[i] = buf1[i] ^ buf2[i];
}

注意在本地和浏览器上寻找可执行的解决方案。

4

1 回答 1

4

我知道 4 种计算方法XOR

  • 本地^运算符
  • (n1+n2)%2
  • n1+n2-2*n1*n2
  • 使用预设数组:xor=[[0,1],[1,0]]

我运行了以下代码,您可以自己查看结果:

buf1=new Array(10000).fill(1).map((x)=>Math.floor(Math.random()*2));
buf2=new Array(10000).fill(1).map((x)=>Math.floor(Math.random()*2));

console.time('go');
for (let i=0;i<10000;i++) r=buf1[i]^buf2[i];
console.timeEnd('go');

console.time('go');
for (let i=0;i<10000;i++) r=(buf1[i]+buf2[i])%2;
console.timeEnd('go');

console.time('go');
for (let i=0;i<10000;i++) r=buf1[i]+buf2[i]-2*buf1[i]*buf2[i];
console.timeEnd('go');

xor=[[0,1],[1,0]];
console.time('go');
for (let i=0;i<10000;i++) r=xor[buf1[i]][buf2[i]];
console.timeEnd('go');

所有方法似乎都给出了相似的结果。

于 2017-12-19T18:44:15.193 回答