Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 21.10.2020, 11:04
Кандидат Javascript-наук
Отправить личное сообщение для jaroslav.tavgen Посмотреть профиль Найти все сообщения от jaroslav.tavgen
 
Регистрация: 18.09.2014
Сообщений: 128

Как удобнее всего тестировать скорость?
Решил сравнить, что быстрее работает: цикл 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.

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

Последний раз редактировалось jaroslav.tavgen, 21.10.2020 в 11:07.
Ответить с цитированием
  #2 (permalink)  
Старый 21.10.2020, 11:27
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,064

Сообщение от jaroslav.tavgen
Получается цикл for быстрее, чем forEach.
да,но в строке 14 несколько циклов, перенесите создание массива до t1 и разница будет на порядок меньше.
Ответить с цитированием
  #3 (permalink)  
Старый 21.10.2020, 11:34
Кандидат Javascript-наук
Отправить личное сообщение для jaroslav.tavgen Посмотреть профиль Найти все сообщения от jaroslav.tavgen
 
Регистрация: 18.09.2014
Сообщений: 128

Сообщение от рони Посмотреть сообщение
да,но в строке 14 несколько циклов, перенесите создание массива до t1 и разница будет на порядок меньше.
А будет ли такой тест корректным? Ведь задача узнать, как будет быстрее: [1,2,3].forEach(...) или for(let i = 0; i < 3; i++){...}
Ответить с цитированием
  #4 (permalink)  
Старый 21.10.2020, 11:41
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,064

Сообщение от jaroslav.tavgen
А будет ли такой тест корректным?
нет, forEach использует замыкания, что теоретически замедляет код, но на практике ваше сравнение бессмысленно, нужно выбирать оптимальный алгоритм, а что для этого использовать дело вкуса, все циклы в браузерах давно максимально оптимизированы.
https://javascript.ru/forum/misc/324...v-voprosy.html
Ответить с цитированием
  #5 (permalink)  
Старый 21.10.2020, 12:15
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,004

Сообщение от jaroslav.tavgen
Ведь задача узнать, как будет быстрее: [1,2,3].forEach(...) или for(let i = 0; i < 3; i++){...}
тебе надо заранее создать массив, и сравнивать скорость forEach по этому массиву с циклом, а то сейчас к forEach есть ещё довешивается создание массива
Ответить с цитированием
  #6 (permalink)  
Старый 21.10.2020, 17:42
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,692

Сообщение от 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 (!!!)

Последний раз редактировалось voraa, 21.10.2020 в 17:53.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как увеличить скорость загрузки javascript файлов Espey Элементы интерфейса 6 26.06.2017 23:28
JSON как хранить как парсить jay-S Общие вопросы Javascript 1 26.05.2017 07:50
Открытие div блока при первом визите на сайт Nushaba Общие вопросы Javascript 28 20.12.2013 21:24
Как организовать RichEdit arma Элементы интерфейса 2 18.02.2010 14:57
Как правильно послать XML в POST запросе LowCoder AJAX и COMET 10 15.07.2009 23:20