У меня вопрос по производительности.
Предположим, у меня есть массивный массив объектов под названием 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), а затем добавляет желаемые значения в набор.
Оба варианта дают одинаковый результат. У меня вопрос: какой из них лучший с точки зрения производительности? Моя цель - сделать работу максимально быстрой. А если есть третий, еще более быстрый вариант, поделитесь, пожалуйста.
@hurricane да, я хорошо знаю нотацию O, и я также знаю, что это даст мне временную сложность O (n). Но мой вопрос не о временной сложности, а о производительности. Я уверен, что разработчики js разработали обе функции наилучшим образом с точки зрения производительности. Это не означает, что, несмотря на одинаковую временную сложность, у них одинаковая скорость / производительность / распределение ресурсов.
Which one is the best performance-wise? Они эквивалентны, поскольку имеют одинаковую временную сложность. Разница будет в наносекундах.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


А что насчет этого? Я думаю, что он легко читается, и это гораздо важнее, чем просто производительность.
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:
forEach() работают довольно близко друг к другу.map() и filter(), примерно в два раза быстрее, чем использование forEach () и переход к новому массиву, чтобы сделать то же самое.forEach() для многоэтапных манипуляций примерно в два раза быстрее, чем методы связывания, такие как filter() и map().Ссылка на источник
Тест для: 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']
Вы слышали о нотации большой буквы O? В вашем случае сложность всегда O (n). И производительность такая же. Первый способ делает его более читаемым :) Пожалуйста, проверьте здесь stackoverflow.com/questions/16917958/…