javascript - 将元素添加到 Uint8ClampedArray 类型数组的快速方法

标签 javascript performance p5.js typed-arrays

正在进行一些像素操作,需要加速将元素添加到数组中的算法。现在我正在丢弃算法期间像素来自的类型化数组。有没有一种快速的方法可以将元素添加到 typedArray 中,如果没有,您是否看到可以对我当前的算法进行任何改进?

我当前的算法如下所示(简化并使用indexesToAdd升序):

//Example input and output
//indexesToAdd = [0,3,4]; // Normally around 4000 elements
//typedArray = [100,200,40,50,100]; // Normally around 1 million elements
//Output = [100,0,200,40,50,0,100,0];
function addIndexes(indexesToAdd, typedArray) {
  var newArray = [];
  var index = 0;

  for(var i=0;i<typedArray.length;i++) {
    if (i != indexesToAdd[index]) {
      newArray.push(typedArray[i]);
    } else {
      newArray.push(typedArray[i], 0);
      index++;
    }
  }

  return newArray;
}

我想过使用 splice 但 Uint8ClampedArray 没有这个能力。 我还尝试将 Uint8ClampedArray 转换为常规数组,以便我可以使用拼接,但此转换过程的长度是算法的 10 倍。

最佳答案

考虑以下因素:

  • 构造一个 Uint8ClampedArray TypedArray 而不是标准数组 ─ 这会降低内存消耗并加快写入速度
  • 删除行重复项和不必要的 else block
  • 预填充最大迭代
  • 使用严格比较

尝试此代码,运行速度提高 7-10 倍(15 毫秒 vs 105 毫秒 ─ 100 万个项目):

function addIndexes(indexesToAdd, typedArray) {
  var newArray = new Uint8ClampedArray(indexesToAdd.length + typedArray.length);
  var index = 0;
  var max = typedArray.length;
  var c = 0;
  for(var i=0;i<max;i++) {
    newArray[c] = typedArray[i];
    if (i !== indexesToAdd[index]) {
      c++;
      newArray[c] = 0;
    }
    c++;
    index++;
  }
  return newArray;
}

关于javascript - 将元素添加到 Uint8ClampedArray 类型数组的快速方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53711771/

相关文章:

javascript - 如何在 Sublime text 上使用 Flask 后端编写 javascript/p5.js 代码时调试并获取错误消息?

javascript - 交互式运行 Javascript 的好方法是什么?

Javascript:如何检查一个 css 样式然后更改另一个 css 样式?

javascript - Twitter 按钮正在创建多个按钮

ajax - 一个 JSON 调用应该检索多少数据?

javascript - Firebase Javascript + P5.js : Asynchronous function getting in the way of redrawing the canvas

javascript - P5.js 中的随机球速

javascript - jspdf/pdfmake 创建 PDF 与将页面打印为 PDF 的好处?

performance - 就地修改数组的函数意外减速

php - 在服务器上存储大量文件 - 按日期的子文件夹?