javascript - 使用 Javascript ArrayBuffer 执行 XOR 的最快方法

标签 javascript arraybuffer bitwise-xor

我有一个表示位的类,它使用 ArrayBuffers 来存储 二进制数据。我想弄清楚是否有更快的方法在两个 ArrayBuffers 之间执行 xor

注意 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 种计算 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');

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

关于javascript - 使用 Javascript ArrayBuffer 执行 XOR 的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47891321/

相关文章:

python - 异或查找两个列表之间缺少的元素

java - XOR 交换在所有情况下都等同于传统交换吗?

math - 重复对连续元素进行异或运算

javascript - 使用 AngularJS 获取图像时出现错误 404

javascript - 如何读取具有 "4 byte single"/浮点/IEEE 754 编码数据中的二进制数据的 ArrayBuffer?

multithreading - 在顺序执行的线程中使用ArrayBuffer?

javascript - 当忽略每个字节的前导位时,是否有一种简单的方法可以从一组字节中生成一个数字?

javascript - 可以使用 chrome 扩展程序将 HTML 标记添加到网站吗?

javascript - lodash:如何不区分大小写 _.find()

javascript - Jquery 添加月份至今