Быстрый способ добавления элементов в типизированный массив Uint8ClampedArray

Работаем над некоторыми манипуляциями с пикселями, и вам необходимо ускорить алгоритм, который добавляет элементы в массив. Прямо сейчас я выбрасываю типизированный массив, из которого пиксели берутся во время алгоритма. Есть ли быстрый способ добавить элементы в 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 в обычный массив, чтобы я мог использовать splice, но этот процесс преобразования был в 10 раз длиннее алгоритма.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
496
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Учтите следующее:

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

Попробуйте этот код работать в 7-10 раз быстрее (15 мс против 105 мс ─ 1 млн элементов):

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

Я проверю это, когда буду дома, выглядит многообещающе.

Vigrant 10.12.2018 20:50

Работает примерно в 4 раза быстрее, как только я могу заставить его работать. Спасибо чувак!

Vigrant 11.12.2018 03:46

Другие вопросы по теме