169 похожих чатов

У меня есть функция которая фильтрует продукты по их

названию
чтобы нормально отфильтровать, и имена продуктов, и филтр (строку) нужно привести в нижний ренгистр. имена продуктов в цикле само собой придется приводить в нижний регистр в функции, но вот сам фильтр можно привести в нижний регистр до использования функции, а в самой функции уже не приводить (чтобы секономить когда масивы большие)
я заметил что в таком случае на ноде производительность на процентов 20 растет, а в браузере при повторных запусках дак вообще на 100 - 200% (20 тыщ элементов в масивен, 1 из которых подпадает под фильтр)
вопрос в том имеет ли смысл это делать, или этак экономия не стоит того чтобы выносить эту логику за функциию, в плане что это нарушает читаемость немного как по мне. или же это как-то можно декомпозировать?

const desiredProductName = 'pIPi'
const isStockedFilter = false

const getProductsByFilter = (products, desiredProductName) => {
return products.filter((product) => {
const isFoundProduct = product.name
.toLowerCase()
.includes(desiredProductName.toLowerCase())
if (!isFoundProduct) {
return
}

const isProductStocked = product.stocked

if (isStockedFilter && !isProductStocked) {
return
}
return true
})
}

let time = performance.now()
console.time('FILTER')

const categories = getProductsByFilter(PRODUCTS, desiredProductName)

time = performance.now() - time
console.timeEnd('FILTER')

const getProductsByFilter2 = (products, desiredProductName) => {
return products.filter((product) => {
const isFoundProduct = product.name
.toLowerCase()
.includes(desiredProductName)
if (!isFoundProduct) {
return
}

const isProductStocked = product.stocked

if (isStockedFilter && !isProductStocked) {
return
}
return true
})
}

let time2 = performance.now()
console.time('FILTER2')

const desiredProductNameLow = desiredProductName.toLowerCase()
const categories2 = getProductsByFilter2(PRODUCTS, desiredProductNameLow)

time2 = performance.now() - time2
console.timeEnd('FILTER2')

7 ответов

5 просмотров

Ну так конечно в первом случае ты применяешь desiredProductName.toLowerCase() на каждую итерацию цикла, а во втором случае ты применяешь его один раз только. Можно написать так const getProductsByFilter3 = (products, desiredProductName) => { const desiredProductNameLow = desiredProductName.toLowerCase() return products.filter((product) => { const isFoundProduct = product.name .toLowerCase() .includes(desiredProductNameLow) if (!isFoundProduct) { return } const isProductStocked = product.stocked if (isStockedFilter && !isProductStocked) { return } return true }) } Так у тебя и приведение в нижний регистр будет один раз выполняться и при этом внутри функции останется

А еще ты можешь сделать так ``` const getProductsByFilter3 = (products, desiredProductName) => { const desiredProductNameLow = desiredProductName.toLowerCase() return products.filter((product) => { const isProductStocked = product.stocked if (isStockedFilter && !isProductStocked) { return } const isFoundProduct = product.name .toLowerCase() .includes(desiredProductNameLow) if (!isFoundProduct) { return } return true }) } ``` Проверять product.stocked до того как проверять по имени, т.к. product.stocked гораздо более быстрая проверка

veal- Автор вопроса
veal- Автор вопроса
veal- Автор вопроса
Denis Deniskov
А еще ты можешь сделать так ``` const getProductsB...

вообще шик, оно +- сравняло результаты со 2 где было вынесено за функцию, но я пототм в той второй функции тоже попробовал переставить местами условия, то есть по сути все теперь что отличает 2 и 3 это то что во 2 сразу передается строка в нижнем регистре, которая вычесляется за пределами функции, а в 3 она вычесляеться в начале но странно что теперь 2 после того как я поменял условаия местами стала еще быстрее

veal
вообще шик, оно +- сравняло результаты со 2 где бы...

Если ты просто поменяешь вызовы местами то время тоже измениться, ты запускаешь так Сначал 1 потом 2. А попробуй сначала 2 потом 1. Так движковые оптимизации срабатывают, чтобы их невилировать надо делать несколько запусков. Например 10 или 100 или побольше=)

veal- Автор вопроса

Похожие вопросы

Обсуждают сегодня

читать файл максимально быстро? странный вопрос))
zamtmn
52
всем привет! углубившись в плюсы и начав изучать реверсинг понял, что без асм'а никуда со своими высокоабстрактными представлениями начал изучать механизмы асма, и не совсем п...
9
буквально один оставшийся вопрос при выполнении строчки mov eax, 5 операнд "5" будет присутствовать где-либо в памяти (любой), кроме как в памяти блока .code? подвопрос: как...
12
Всем ку. Подскажите, если задекларировал массив так: int arr[10] = {1, 2, 3, 4}, то в arr[4] будет мусор или нуль?
Sasha K
14
я не понимаю mov [r11+8],rcx и прочие. мы записываем значение из rcx, куда?
Bor
15
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
у меня такой вопрос про память в x86 возник, может кто пояснить?.. у процессора есть (как минимум) 3 типа адресов (названия "п1", "п2", "п3" --- мои, чтобы проще было дальше)...
Toideng
5
А какие расширения активно используются в промышленности? Именно идейные, по типу гадт, а не всякие оверлоадедстрингс
Степан
11
у процессора есть (как минимум) 3 типа адресов (названия "п1", "п2", "п3" --- мои, чтобы проще было дальше): - "п1" --- виртуальный адрес, то есть тот, который ресолвится в "п...
Toideng
3
Guys Who’s kurdish on this group?
Hiwa Amiri
11
Карта сайта