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 ответов

18 просмотров

Ну так конечно в первом случае ты применяешь 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- Автор вопроса

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта