Как правильно замерять время выполнения последовательных скриптов JS?

Вот например скрипт на расчет факториала (прошу простить за возможные косяки - это мой первый вопрос на данном сайте).

<script>
    var x = x2 = +prompt('Enter value');

      // Вычисление факториала без использования цикла

    var time = performance.now();
    function factorial(x){
        if (x<=1) return 1;
        return x*factorial(x-1);
    }
    time = performance.now() - time;
    alert(' factorial=' + factorial(x) + '\n Время вып. СКРИПТА с помощью функции = ' + time.toFixed(5));
    
    // Вычисление факториала с использованием цикла
    let i=x2;
    var time2 = performance.now();
    for (i;i>1;i--) {
        x2*=(i-1);    
        }
    time2 = performance.now() - time2;
    alert(' factorial=' + x2 + '\n Время вып. СКРИПТА с помощью цикла = ' + time2.toFixed(5));
</script>

Но есть уверенность, что время выполнения каждого скрипта выводит не правильное. При отключении 1-го вычисления факториала через функцию, почему-то меняется время выполнения 2-го вычисления через цикл. Подскажите где копать?


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

Автор решения: Aziz Umarov

Извините что с телефона.

var x = x2 = +prompt('Enter value');

// Вычисление факториала без использования цикла
function factorial(x) {
  if (x <= 1) return 1;
  return x * factorial(x - 1);
}

var time = performance.now();
var factorialX = factorial(x);

time = performance.now() - time;

console.log(' factorial=' + factorialX + '\n Время вып. СКРИПТА с помощью функции = ' + time.toFixed(5));

// Вычисление факториала с использованием цикла
let i = x2;
var time2 = performance.now();
for (i; i > 1; i--) {
  x2 *= (i - 1);
}
time2 = performance.now() - time2;
console.log(' factorial=' + x2 + '\n Время вып. СКРИПТА с помощью цикла = ' + time2.toFixed(5));

У вас вычисление с факториалом не много не верно, я поправил. Нужно замерять время между вызовами а не определениями.

→ Ссылка
Автор решения: vp_arth
  1. Нужно аккуратнее расставлять отметки времени(вокруг тестируемого кода)
  2. Такой простой код нужно выполнять многократно, иначе вы будете тестировать случайные факторы, а не код

let n = 25, N = 1000000;

    // Вычисление факториала без использования цикла

    function factorial(x){
        if (x<=1) return 1;
        return x*factorial(x-1);
    }
    
    let time = performance.now();    // start

    let f1; 
    for (let i = 0; i < N; ++i) { 
      f1 = factorial(n);           // call
    }
    time = performance.now() - time; // end
    console.log(' factorial=' + f1 + '\n Время вып. СКРИПТА с помощью функции = ' + time.toFixed(5));
    
    // Вычисление факториала с использованием цикла
    let time2 = performance.now();
    let x = n, x2;
    for (let i = 0; i < N; ++i) {
      x2 = x;
      for (let k=n;k>1;k--) {
        x2 *= (k-1);    
      }
    }
    time2 = performance.now() - time2;
    console.log(' factorial=' + x2 + '\n Время вып. СКРИПТА с помощью цикла = ' + time2.toFixed(5));

→ Ссылка