Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как удобнее всего тестировать скорость? (https://javascript.ru/forum/misc/81214-kak-udobnee-vsego-testirovat-skorost.html)

jaroslav.tavgen 21.10.2020 11:04

Как удобнее всего тестировать скорость?
 
Решил сравнить, что быстрее работает: цикл for или forEach.

Написал такой тест:
let time = 10000000;
let test1 = () =>{
  let a1 = 0;
  let t1 = performance.now();
  for(let i = 0; i < time; i++){
    a1++;
  }
  console.log(`Time: ${(performance.now()-t1)/1000} seconds`); // Time: 0.036104999999981374 seconds

}
let test2 = () =>{
  let a1 = 0;
  let t1 = performance.now();
  Array.from({length:time}, _=>0).forEach(_=>a1++);
  console.log(`Time: ${(performance.now()-t1)/1000} seconds`); // Time: 1.7714999999997671 seconds

}
console.clear();
test1();
test2();

Получается цикл for быстрее, чем forEach.

Вопрос: мой способ тестирования правильный или нет?

рони 21.10.2020 11:27

Цитата:

Сообщение от jaroslav.tavgen
Получается цикл for быстрее, чем forEach.

да,но в строке 14 несколько циклов, перенесите создание массива до t1 и разница будет на порядок меньше.

jaroslav.tavgen 21.10.2020 11:34

Цитата:

Сообщение от рони (Сообщение 529984)
да,но в строке 14 несколько циклов, перенесите создание массива до t1 и разница будет на порядок меньше.

А будет ли такой тест корректным? Ведь задача узнать, как будет быстрее: [1,2,3].forEach(...) или for(let i = 0; i < 3; i++){...}

рони 21.10.2020 11:41

Цитата:

Сообщение от jaroslav.tavgen
А будет ли такой тест корректным?

нет, forEach использует замыкания, что теоретически замедляет код, но на практике ваше сравнение бессмысленно, нужно выбирать оптимальный алгоритм, а что для этого использовать дело вкуса, все циклы в браузерах давно максимально оптимизированы.
https://javascript.ru/forum/misc/324...v-voprosy.html

Alexandroppolus 21.10.2020 12:15

Цитата:

Сообщение от jaroslav.tavgen
Ведь задача узнать, как будет быстрее: [1,2,3].forEach(...) или for(let i = 0; i < 3; i++){...}

тебе надо заранее создать массив, и сравнивать скорость forEach по этому массиву с циклом, а то сейчас к forEach есть ещё довешивается создание массива

voraa 21.10.2020 17:42

Цитата:

Сообщение от jaroslav.tavgen
А будет ли такой тест корректным? Ведь задача узнать, как будет быстрее: [1,2,3].forEach(...) или for(let i = 0; i < 3; i++){...}

Нет.
В forEach идет обращение к массиву.
А в for у вас нет обращения к массиву.
Корректнее было бы так

let time = 10000000;
let arr = Array.from({length:time}, (_, i)=> i)

let test1 = () =>{
  let s = 0;
  let t1 = performance.now();
  for(let i = 0; i < time; i++){
    s += arr[i]
  }
  console.log(`${s} Time: ${(performance.now()-t1)/1000} seconds`); 
}

let test2 = () =>{
  let s = 0;
  let t1 = performance.now();
  arr.forEach( x => s += x);
  console.log(`${s} Time: ${(performance.now()-t1)/1000} seconds`); 
}
console.clear();
test1();
test2();


У меня результаты в Хроме
49999995000000 Time: 0.020264999999199063 seconds
49999995000000 Time: 0.24552500000572763 seconds

Но Firefox рвет его, как Тузик грелку

49999995000000 Time: 0.016 seconds
49999995000000 Time: 0.05 seconds (!!!)


Часовой пояс GMT +3, время: 08:37.