Спасибо огромное за лекцию, было очень полезно! Можете ли поделиться лабораторками для практики декомпозиции или если уже поделились то подсказать где можно их найти🙏
Ведь забрать по ключу значение из объекта - моментально. А indexOf, все равно, внутри перебирает и сравнивает каждое значение. indexOf - O(n) , hash O(1). Если я не прав - поправьте, пожалуйста)
ruclips.net/video/cTv7V22mkwE/видео.html Если не ошибаюсь, то Map это не хеш таблица, т.к в качестве ключа может хранить объекты, и если попытаемся перезаписать значение по ключу, то это добавит вторую запись, но не перезапишет предыдущее значение, по-скольку, ссылки разные, тем не менее, Map более оптимизирован, чем обычная коллекция.
Спецификация не говорит, как Map должен работать внутри и описывает только внешний интерфейс tc39.es/ecma262/#sec-map-objects но все вменяемые движки используют хештаблицы для этого
@@TimurShemsedinov хм.. проверил. При таком размере массива разница минимальна, хотя массив немного выигрывает. Вот результаты замера: x => arr.indexOf(x): 3298.822021484375 ms x => obj[x]: 3495.64501953125 ms x => map.get(x): 3351.541015625 ms 350028119 350028119 350028119 И сам код: const arr = ['black', 'red', 'green', 'yellow', 'blue', 'margenta', 'cyan', 'white'] const obj = Object.create(null); for (let q=0; q [x, i])) const data = Array.from({ length: 100000000 }, () => arr[Math.random() * arr.length | 0]) function check(f) { const hint = f + "" let res = 0 console.time(hint) for (const x of data) { res += f(x) } console.timeEnd(hint) return res } const x = check(x => arr.indexOf(x)) const y = check(x => obj[x]) const z = check(x => map.get(x)) console.log(x, y, z)
@@TimurShemsedinov блин, что-то ютьюб комментарий удаляет. Если в функции с indexOf прибавить 1, то производительность значительно падает - этот вариант проигрывает остальным на 20-25%.
@Timur Shemsedinov Это только если не прибавлять единицу к индексу (вместо этого добавить null в начало массива, например). Тогда и правда вариант с массивом получается быстрее (мистика:)): 100 миллионов вызовов у меня заняли 60 мс для массива против 90 мс для объекта и мэпа. Но + 1 всё портит и замедляет работу раз в 25-30, из-за чего вариант с массивом, как он представлен в примере, сильно проигрывает по скорости оставшимся двум. А Map и Object в этом примере работают одинаково быстро. Если не ошибаюсь, в какой-то из лекций вы говорили, что простой объект может работать в режиме хэш-таблицы. Наверное, это как раз тот случай.
@@ДенисОсипов-у5ь С режимом хэш-таблицы всё не так просто, но можно попробовать его спровоцировать удалением и добавлением свойства. Как у тебя получилось 20-50 раз когда у меня 20-25%? Можешь код показать?
Здравствуйте. В Redux(reduser) используют такой антипатерн switch case. Приходит тип и если он совпадает с кейсом, то возвращает то что внутри(в основном функции). В реакте на больших проектах в файле редюсера могут быть 1000 строк одного switch и реально от этого тошнит. Но все пользуются этим. Что скажете по этому поводу? Спасибо
1:00 - Unreachable code
3:43 - Dead code
5:54 - Switch
10:25 - Parameters
19:31 - Accumulate and fire
22:21 - Micro Optimization
40:23 - Nested Loops
50:20 - Long Methods, functions , procedures
Дякую за пояснення та наведені приклади.
Наконец-то лекция со знакомым материалом, ведь всё это я уже применял :D
Как же круто на простом примере объяснена важность правильной структуры данных. Спасибо
, спасибо , Тимур , за профессиональный контент !!!
Отличная лекция, поможет писать чистый код на JS, рекомендую.
Оптимизация со здравым смыслом от практика (а не от снобистских хипстеров, начитавшихся этих ваших интернетов).
Спасибо!
спасибо огромное, Тимур!
Anatoly Kobzisty, а где коммент с самыми удобными в мире тайм кодами....((
Спасибо огромное за лекцию, было очень полезно! Можете ли поделиться лабораторками для практики декомпозиции или если уже поделились то подсказать где можно их найти🙏
Возможно подойдут такие экзаменационные задания github.com/HowProgrammingWorks/Exams
@@TimurShemsedinov Спасибо большое! 🤓
В примере с цветами вы упомянули что поиск по массиву с помощью indexOf быстрее, нежели обращение к объекту по ключу. Вы не оговорились?
Ведь забрать по ключу значение из объекта - моментально. А indexOf, все равно, внутри перебирает и сравнивает каждое значение. indexOf - O(n) , hash O(1). Если я не прав - поправьте, пожалуйста)
like and comment as usual ;)
ruclips.net/video/cTv7V22mkwE/видео.html Если не ошибаюсь, то Map это не хеш таблица, т.к в качестве ключа может хранить объекты, и если попытаемся перезаписать значение по ключу, то это добавит вторую запись, но не перезапишет предыдущее значение, по-скольку, ссылки разные, тем не менее, Map более оптимизирован, чем обычная коллекция.
Спецификация не говорит, как Map должен работать внутри и описывает только внешний интерфейс tc39.es/ecma262/#sec-map-objects но все вменяемые движки используют хештаблицы для этого
8:46 - почему быстрее? Наоборот же словарь должен быть быстрее. Да и красивее, по-моему.
16:09 - new Date посеял.
Нет, маленький массив с однотипными элементами и без дырок работает гораздо быстрее Map и тем более Object
@@TimurShemsedinov хм.. проверил. При таком размере массива разница минимальна, хотя массив немного выигрывает.
Вот результаты замера:
x => arr.indexOf(x): 3298.822021484375 ms
x => obj[x]: 3495.64501953125 ms
x => map.get(x): 3351.541015625 ms
350028119 350028119 350028119
И сам код:
const arr = ['black', 'red', 'green', 'yellow', 'blue', 'margenta', 'cyan', 'white']
const obj = Object.create(null); for (let q=0; q [x, i]))
const data = Array.from({ length: 100000000 }, () => arr[Math.random() * arr.length | 0])
function check(f) {
const hint = f + ""
let res = 0
console.time(hint)
for (const x of data) {
res += f(x)
}
console.timeEnd(hint)
return res
}
const x = check(x => arr.indexOf(x))
const y = check(x => obj[x])
const z = check(x => map.get(x))
console.log(x, y, z)
@@TimurShemsedinov блин, что-то ютьюб комментарий удаляет. Если в функции с indexOf прибавить 1, то производительность значительно падает - этот вариант проигрывает остальным на 20-25%.
@Timur Shemsedinov Это только если не прибавлять единицу к индексу (вместо этого добавить null в начало массива, например). Тогда и правда вариант с массивом получается быстрее (мистика:)): 100 миллионов вызовов у меня заняли 60 мс для массива против 90 мс для объекта и мэпа. Но + 1 всё портит и замедляет работу раз в 25-30, из-за чего вариант с массивом, как он представлен в примере, сильно проигрывает по скорости оставшимся двум.
А Map и Object в этом примере работают одинаково быстро. Если не ошибаюсь, в какой-то из лекций вы говорили, что простой объект может работать в режиме хэш-таблицы. Наверное, это как раз тот случай.
@@ДенисОсипов-у5ь С режимом хэш-таблицы всё не так просто, но можно попробовать его спровоцировать удалением и добавлением свойства. Как у тебя получилось 20-50 раз когда у меня 20-25%? Можешь код показать?
Здравствуйте. В Redux(reduser) используют такой антипатерн switch case. Приходит тип и если он совпадает с кейсом, то возвращает то что внутри(в основном функции).
В реакте на больших проектах в файле редюсера могут быть 1000 строк одного switch и реально от этого тошнит. Но все пользуются этим.
Что скажете по этому поводу? Спасибо
Вместо этого нужно использовать коллекции, это и читаемо и быстрее
Обычно советуют дробить редюсеры что бы такого не было. В редаксе можно использовать мидлваре комбайнРедюсер
Кант из Кенинсберга! Я с приятием смотрю Ваши лекции о программировании, но мне претит Ваша коммунистическая пропаганда!
Спасибо!