MisticX
@MisticX
Кратно обо мне

Как повысить производительность js-кода?

Доброго времени суток, хабровчане!
Недавно начал заниматься на codewars и возникла проблема со скоростью выполнения кода.
Есть код:
function partsSums(ls) {
  ls.reverse();
  let a = 0;
  arr = [];
  let s = ls.length;
  for(let i = s; i--;){
    for(let j = ls.length; j--;){
      a += ls[j];
    }
    arr.push(a);
    ls.pop();
    a = 0;
  }
  arr.push(0);
  return ls ? arr : [0];
}

При глобальном тесте он выполняется более 12 секунд. Как мне уменьшить время выполнения кода? Какие приёмы оптимизации здесь нужно применить?
https://www.codewars.com/kata/5ce399e0047a45001c85... - ссылка на кату
  • Вопрос задан
  • 263 просмотра
Решения вопроса 1
RAX7
@RAX7
возникла проблема со скоростью выполнения кода

Проблема в самом алгоритме. Не нужно суммировать элементы массива на каждой вложенной итерации, достаточно одного прохода по массиву. Код придется полностью переписать.
решение

function partsSums(ls) {
  const result = new Array(ls.length + 1);
  result[ls.length] = 0;

  for (let i = ls.length - 1; i > -1; i--) {
    result[i] = result[i + 1] + ls[i];
  }

  return result;
}

Ответ написан
Пригласить эксперта
Ответы на вопрос 1
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Я вот так сделал:
function partsSums(ls) {
    if(ls.length==0) return [0];
    result=ls;
    result[i=result.length]=0;
    i--;
    while(i!==-1)
      result[i] = result[i+1]+ls[i--];
    return result;
}
Test Results:
partsSums
Basic tests
Random tests
Completed in 2070ms
линк

PS:
RAX7, ... а моё за ~3000ms ¯\_(ツ)_/¯
выжмешь ещё круче?)

PS2: RAX7, Кстати, там лучший результат - это тоже мутация, но работает за 927.29ms (наши же - менее 100ms).
function partsSums(ls) {
    ls.unshift(0);
    let sum = ls.reduce((p, c) => p + c, 0);
    return ls.map(v => sum = sum - v);
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы