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

时间:2018-12-10 18:43:23

标签: javascript performance p5.js typed-arrays

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

我当前的算法如下所示(已简化,并且使用indexsToAdd递增):

//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;
}

我考虑过使用拼接器,但Uint8ClampedArray没有此功能。 我还尝试将Uint8ClampedArray转换为常规数组,以便可以使用拼接,但是此转换过程是算法的10倍。

1 个答案:

答案 0 :(得分:1)

请考虑以下内容:

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

尝试此代码以X7-10倍的速度运行(15ms对105ms─1M项):

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;
}