Быстрый способ добавления элементов в типизированный массив Uint8ClampedArray - PullRequest
0 голосов
/ 10 декабря 2018

Работа над некоторыми пиксельными манипуляциями и должна ускорить алгоритм, который добавляет элементы в массив.Прямо сейчас я выбрасываю типизированный массив, из которого поступают пиксели во время алгоритма.Есть ли быстрый способ добавить элементы в typedArray, и если нет, то вы видите какие-либо улучшения, которые могут быть сделаны в моем текущем алгоритме?

Мой текущий алгоритм выглядит следующим образом (упрощенно и с indexesToAdd ascending):

//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 голосов
/ 10 декабря 2018

Примите во внимание следующее:

  • Создайте Uint8ClampedArray TypedArray вместо стандартного Array ─ это уменьшит потребление памяти и ускорит запись
  • Удалите дубликаты строк и ненужный блок else
  • Предварительно заполнить максимальные итерации
  • Использовать строгое сравнение

Попробуйте этот код работает в X7-10 раз быстрее (15 мс против 105 мс ─ 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;
}
...