Производительность - foreach с условием внутри vs фильтр с тем же условием и foreach на отфильтрованном массиве в javascript

У меня вопрос по производительности. Предположим, у меня есть массивный массив объектов под названием records. Моя цель - создать набор (который гарантирует, что у меня есть разные значения), содержащий значение value записей из records, которые соответствует определенному условию - if (rec.otherValue === 'something specific'). У меня есть два возможных пути, которые приведут к желаемому результату:

Опция 1:

const set = new Set();
records.foreach(rec => {
   if (rec.otherValue === 'something specific'){
       set.add(rec.value);
   }
});

Первый вариант прост. Я просматриваю все записи и добавляю желаемое значение в Set, если выполняется конкретное условие.

Вариант 2:

const set = new Set();
const filteredRecords = records.filter(rec => rec.otherValue === 'something specific');
filteredRecords.foreach(rec => {
   set.add(rec.value);
});

Второй вариант сначала фильтрует массивный массив records, чтобы получить гораздо более конкретный массив объектов (от сотен записей до менее 10), а затем добавляет желаемые значения в набор.

Оба варианта дают одинаковый результат. У меня вопрос: какой из них лучший с точки зрения производительности? Моя цель - сделать работу максимально быстрой. А если есть третий, еще более быстрый вариант, поделитесь, пожалуйста.

Вы слышали о нотации большой буквы O? В вашем случае сложность всегда O (n). И производительность такая же. Первый способ делает его более читаемым :) Пожалуйста, проверьте здесь stackoverflow.com/questions/16917958/…

hurricane 06.04.2021 22:06

@hurricane да, я хорошо знаю нотацию O, и я также знаю, что это даст мне временную сложность O (n). Но мой вопрос не о временной сложности, а о производительности. Я уверен, что разработчики js разработали обе функции наилучшим образом с точки зрения производительности. Это не означает, что, несмотря на одинаковую временную сложность, у них одинаковая скорость / производительность / распределение ресурсов.

Gabriel Edery 06.04.2021 22:09
Which one is the best performance-wise? Они эквивалентны, поскольку имеют одинаковую временную сложность. Разница будет в наносекундах.
hurricane 06.04.2021 22:28
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
31
3

Ответы 3

А что насчет этого? Я думаю, что он легко читается, и это гораздо важнее, чем просто производительность.

const condition = val => val === 'something specific'
const set = new Set(records.filter(condition))

Если вам нужна скорость, ничто не может сравниться с собственным (ванильным) javascript, когда дело касается производительности. Потом,

for (var i=0; i< records.length; i++) {
// your operations
}

Пожалуйста, проверьте: Почему использование for быстрее, чем some () или filter ()

а также

https://web.archive.org/web/20170403221045/https://blogs.oracle.com/greimer/entry/best_way_to_code_a

Testing this
I was curious about just how much faster the modern methods are, so I set up some tests on JSPerf. Here’s what I found:

  • Циклы for и метод forEach() работают довольно близко друг к другу.
  • Такие методы, как map() и filter(), примерно в два раза быстрее, чем использование forEach () и переход к новому массиву, чтобы сделать то же самое.
  • Использование forEach() для многоэтапных манипуляций примерно в два раза быстрее, чем методы связывания, такие как filter() и map().
  • Эти результаты были одинаковыми для Chrome, Firefox и Safari. Я был обеспокоен тем, что таким образом был оптимизирован только механизм рендеринга JavaScript V8, но все современные браузеры показали аналогичные результаты.

Ссылка на источник
Тест для: reduce (), filter (), map (), forloop и forEach ()

Я пробовал запустить тест несколько раз и получил цикл for как самый медленный, а forEach() и reduce() как самый быстрый.

Есть еще один вариант, который вы можете использовать с использованием reduce().

Вот пример:

let data = [
  {
    id: 1,
    value: 'one'
  }, {
    id: 2,
    value: 'two'
  }, {
    id: 3,
    value: 'three'
  }, {
    id: 4,
    value: 'four'
  }, {
    id: 5,
    value: 'five'
  },
];

// Filters IDs of odd numbers [1,3,5]
let new_arr = data.reduce((a, b) => {
  if ([1,3,5].includes(b.id)) {
    a.push(b.value);
  }
  return a;
}, []);
console.info(new_arr); // Expected Result: ['one', 'three', 'five']

// Or you can use this one Liner
let new_arr_1 = data.reduce((a, b) => a.concat(([1,3,5].includes(b.id) ? b.value: [])), []);
console.info(new_arr_1); // Expected Result: ['one', 'three', 'five']

Другие вопросы по теме