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



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Учтите следующее:
Попробуйте этот код работать в 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;
}
Работает примерно в 4 раза быстрее, как только я могу заставить его работать. Спасибо чувак!
Я проверю это, когда буду дома, выглядит многообещающе.