Как оптимизировать сет в буферный массив?

Есть вопрос по оптимизации кода.

Цель понять как уменьшить объем кода в Example 1, без значительного уменьшения производительности.

Branchmark

Setup:

let data1={line:new Float32Array(50000)}
let data2={line:new Float32Array(50000)}


function setBuffer(name, figure_num, data_p){

  let num = 5 * figure_num
  let buffer_array = data1[name]
  for (let i = 0, l = data_p.length; i < l; i++) {
    buffer_array[num + i] = data_p[i];
  }
}

Example 1:

let pt1=[1,2]
let pt2=[3,4]
let status=5
for(let i=0;i<10000;i++){
  let buffer_array = data2['line']
  let num = 5*i;
  buffer_array[num+0] = pt1[0];
  buffer_array[num+1] = pt1[1];
  buffer_array[num+2] = pt2[0];
  buffer_array[num+3] = pt2[1];
  buffer_array[num+4] = status;

}

Example 2:

let pt1=[1,2]
let pt2=[3,4]
let status=5

for(let i=0;i<10000;i++){
  setBuffer('line', i, [pt1[0],pt1[1],pt2[0],pt2[1],status])
}

введите сюда описание изображения


Ответы (1 шт):

Автор решения: vp_arth

let pt1=[1,2]
let pt2=[3,4]
let status=5
let N = 5; // 10000
const data2 = {
 line: new Float32Array(5*N),
};
for(let i=0;i<N;i++){
  data2.line.set([pt1[0],pt1[1],pt2[0],pt2[1],status], 5 * i);
}
console.log(data2)

Хотя, при записи сэмпла в 5 элементов TypedArray.set вряд ли что-то выиграет у прямого доступа)

Мне кажется, если это стало действительно узким местом в вашем приложении, стоит посмотреть на какой-нибудь WebAssembly или, если дело происходит не в браузере, то на другой высокопроизводительный инструмент =)

→ Ссылка