названию
чтобы нормально отфильтровать, и имена продуктов, и филтр (строку) нужно привести в нижний ренгистр. имена продуктов в цикле само собой придется приводить в нижний регистр в функции, но вот сам фильтр можно привести в нижний регистр до использования функции, а в самой функции уже не приводить (чтобы секономить когда масивы большие)
я заметил что в таком случае на ноде производительность на процентов 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')
Ну так конечно в первом случае ты применяешь 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 гораздо более быстрая проверка
ООООООООО, почему я об этом не подумал)
точно, точно, спасибо)
вообще шик, оно +- сравняло результаты со 2 где было вынесено за функцию, но я пототм в той второй функции тоже попробовал переставить местами условия, то есть по сути все теперь что отличает 2 и 3 это то что во 2 сразу передается строка в нижнем регистре, которая вычесляется за пределами функции, а в 3 она вычесляеться в начале но странно что теперь 2 после того как я поменял условаия местами стала еще быстрее
Если ты просто поменяешь вызовы местами то время тоже измениться, ты запускаешь так Сначал 1 потом 2. А попробуй сначала 2 потом 1. Так движковые оптимизации срабатывают, чтобы их невилировать надо делать несколько запусков. Например 10 или 100 или побольше=)
я тоже пробовал, оно также
Обсуждают сегодня