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

Ребят подскажите какой вариант более правильный и почему? 1) const Comp

= ({id}) => {
const renderName = () => id % 2 ===0 ? 'even' : 'odd'
return <div>{renderName()}</div>
}

2) const renderName = (id) => id % 2 ===0 ? 'even' : 'odd'

const Comp = ({id}) => {
return <div>{renderName(id)}</div>
}

17 ответов

12 просмотров

2 более правильный, потому что функция renderName будет создана только 1 раз в 1 случае же, функция будет пересоздаватся при каждом ререндере но на самом деле, это не сильно повлияет на перфоменс

const renderName = useMemo(() => id % 2 ? 'odd' : 'even', [id])

Mykhailo Kaduk
const renderName = useMemo(() => id % 2 ? 'odd' : ...

это плохой вариант, совершенно не нужная мемоизация

Daulet-Сактаганов Автор вопроса
Maxim Koylo
это не повлияет абсолютно

Если функиция сложная то повлияет же по логике

Daulet Сактаганов
Если функиция сложная то повлияет же по логике

да какая бы она не была ее обьявление на каждом рендере это невероятно быстрая операция

Daulet-Сактаганов Автор вопроса
Maxim Koylo
да какая бы она не была ее обьявление на каждом ре...

А как же понятие что компонента должна быть чистой

Daulet Сактаганов
А как же понятие что компонента должна быть чистой

По твоему это у нас грязный компонент?) const Comp = () => { const render = () => <div>text</div> return ( <div>{render()}</div> ) }

Daulet Сактаганов
А как же понятие что компонента должна быть чистой

может ты имел ввиду stateless компоненты? но все равно это не причем в данном случае

Maxim Koylo
это плохой вариант, совершенно не нужная мемоизаци...

ну человек переживал что функция будет создаваться каждый раз. Пусть не переживает

Mykhailo Kaduk
ну человек переживал что функция будет создаваться...

так может так ему и надо было писать, а не давать вредный совет?

Maxim Koylo
так может так ему и надо было писать, а не давать ...

так может со своей стороны напишешь? Учитель) А по поводу ненужной мемоизации - покажи мне метрику, где показано, насколько больше занимает этот расчет в сравнении с мемоизацией (сравнением значения и обращением к аккумулятору)

Mykhailo Kaduk
так может со своей стороны напишешь? Учитель) А по...

Мемоизация это не бесплатно, на хранение мемоизированого значения тратиться память и доп затраты для вычисления нужно ли нам вычислять значение заново или нет https://kentcdodds.com/blog/usememo-and-usecallback

Maxim Koylo
Мемоизация это не бесплатно, на хранение мемоизиро...

собсно что я и написал) Только затраты эти, как правило, очень маленькие. Просто хранишь аккумулятор для предыдущих аргументов и значения. В даном конкретном случае - да, мемоизация - скорее защита от страхов)

Mykhailo Kaduk
собсно что я и написал) Только затраты эти, как пр...

Нет. Без реального измерения и понимания хотя бы порядков этих затрат - это всё бессмысленно. То, что в статье написано должно всех натолкнуть на мысль - научиться измерять, для своих проектов, в своем окружении... без этого такие статьи абсулютно бессмыссленны.

Gena Black
Нет. Без реального измерения и понимания хотя бы п...

Я не хочу холиварить. Просто интересно стало. Есть какие-то данные о реальном импакте, по типу разноскейловых проектов, где кто-то хуярил мемоизацию для всего и для ничего? МОжет знаешь такие? я просто частенько сижу и думаю, вот стоит этот импакт того или нет. И в итоге все сводится очень часто к одной простой вещи. Если на проекте принято мемоизировать, то херячу, а если нет, то нет. Ну, если там будет редьюс в мапе в фильтре и т.д. и тп, то понятно, но вот в более простых кейсах, мне кажется, что самая большая экономия - это экономия времени разработчика, когда он не думает, а делает)

Mykhailo Kaduk
Я не хочу холиварить. Просто интересно стало. Есть...

Не знаю... Мемоизация для всего это конечно перебор. Но по опыту, ререндер чего-то сложнее одной ф-ции должен быть медленнее любой мемоизации (имеется ввиду сам механизм мемоизации, не целиком useMemo). Для примера (цифры не реальные, а с отладчика, который в хроме на хосте, но в среднем отличия от девайса в продакшн режиме не на порядки, в дебаггере чуть быстрее, чем на телефоне в проде), акшн в redux + сложный большой редьюсер с immer'ом + куча селекторов ~5мс и ререндер компонентов с реконсайлингом (без селекторов) ~40мс, из которых ~18ms экран с FlatList, ~10ms экран с айтемом и остальное какая-то неизвестная машинерия с бесконечным шедулингом фиберов внутри реакта. На этих цифрах текст было невозможно редактировать в поле ввода - лезли баги рассинхронизации с нативом. Т.е. пыталось приехать больше одного onChange пока JS тред был занят. Я поменял в селекторах ф-цию сравнения с shallow на deep equal, и чуть memo добавил в нужных местах. Экран со списком вообще перестал ререндериться (потому что данные непосредственно нужные списку не менялись), а остальное... В общем в сухом остатке, по вне реактовским вещам так и осталось ~5ms, а ререндер остался только в текстовом поле и вместе с реконсайлингом и прочей машинерией стали занимать ~10ms. А главное, стало возможно работать после этого с приложением.

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

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

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно 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
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
Карта сайта