Порридж В Ко-ливинге
Я конечно понимаю, что Array.push типо O(1), но реалокацию памяти, особенно когда 10^8 элементов никто не отменял
Порридж В Ко-ливинге
Попробуй просто сделать массив фикс длиныы
Порридж В Ко-ливинге
https://github.com/vanesyan/adventofcode2020/blob/master/src/15.js
Где-то плачит один for loop 😿
Roman
так с мапой он за 5сек решается, bottleneck в объекте был, который выдавал 3мин
Lynn «Кофеман»
Я конечно понимаю, что Array.push типо O(1), но реалокацию памяти, особенно когда 10^8 элементов никто не отменял
Там массив попеременно 1 и 0 элементов имеет. Думаю движок не занимается реаллокацией, а просто меняет чиселку length и сохраняет число в первый слот массива
Roman
Там массив попеременно 1 и 0 элементов имеет. Думаю движок не занимается реаллокацией, а просто меняет чиселку length и сохраняет число в первый слот массива
так там и реаллоцировать нечего же) начальный капасити задается обычно какие-нибудь N=5, а потом фактором увеличивается, а тут длина либо 0, либо 1
Порридж В Ко-ливинге
А, да увидел, я не увидел shift
Roman
Какой bottleneck?
поиск по объекту по ключу намного медленее, чем поиск по мапе
Lynn «Кофеман»
Какой bottleneck?
map.has(n) быстрее n in obj или obj[n]. Потому что не ходит вверх по прототипу
Порридж В Ко-ливинге
Вряд ли в 36 раз медленнее
Roman
Разве на много?
я не замерял, но смена структуры дала снижение с 3мин до 5сек
Lynn «Кофеман»
Да вообще объекты не заточены под три миллиона ключей
Порридж В Ко-ливинге
map.has(n) быстрее n in obj или obj[n]. Потому что не ходит вверх по прототипу
Это понятно. Я не ожидал разницу в 36раз. Ну в 10 от силы
Roman
map.has(n) быстрее n in obj или obj[n]. Потому что не ходит вверх по прототипу
разве он будет ходить по прототипу у Object.create(null)?
Lynn «Кофеман»
К тому же целочисленных ключей, что заставляет объект их сортировать, ибо целочисленные неотрицательные ключи в объекте всегда отсортированы
Lynn «Кофеман»
В общем, простой объект это плохое хранилище для нескольких миллионов значений
Lynn «Кофеман»
Интересно проверить что будет если использовать ключи вида a123, что б они были не numeric
Порридж В Ко-ливинге
Сортировался бы словарным способом
Lynn «Кофеман»
Зачем? Для быстрого поиска по ним в будущем?
Стандарт заставляет ибо некоторые разработчики рассчитывают на такое поведение несмотря на заявленную несортированность. Из-за них это протащили в стандарт
Порридж В Ко-ливинге
Было до ES6 не стандартом, но все браузеры делали так. В итоге решили сделать стандартом
Evgeniy
Расчет видимо на то, что никто не будет много ключей создавать
Evgeniy
Небольшое количество можно быстро отсортировать
Lynn «Кофеман»
Ну да, это было особенностью имплементации. Но тут же как обычно, в (условном) browser1 так сделали. Разработчики browser2 и browser3 может и хотели бы по другому, но тогда ломались сайты тех авторов которые заложились на поведение browser1. Пришлось сделать так же. А потом глядь, и все считают что именно так и должно быть. Пришлось запихать в стандарт.
Roman
https://tc39.es/ecma262/#sec-ordinaryownpropertykeys а вот ссылочка на стандарт подъехала)
Порридж В Ко-ливинге
Где (where) правда?
Lynn «Кофеман»
В общем, как обычно, жопа лошади 😀
Порридж В Ко-ливинге
🤣
Lynn «Кофеман»
Где (where) правда?
В 2. В 1 тебе хром отсортировал по алфавиту для красоты
Порридж В Ко-ливинге
Интересно проверить что будет если использовать ключи вида a123, что б они были не numeric
Then all string keys (that are not indices), in the order in which they were created По идее тогда бы было быстрее чем числа
Evgeniy
Лишь бы они были разумными)
Viktor
Лишь бы они были разумными)
вот такой роскоши может не быть 🙂
Evgeniy
вот такой роскоши может не быть 🙂
Тогда понять и простить)
Viktor
Что-то я так задрался писать код в сегодняшней задаче, что во второй части, когда получил мапинг между позициями и возможными названиями, взял аутпут и в соседней вкладке через find-and-replace нашёл соответствия и запамил на нужные чиселки в своём билете руками 😂
Порридж В Ко-ливинге
Ну и правильно, ручками тоже иногда надо работать
Viktor
Ну и правильно, ручками тоже иногда надо работать
как минимум, в данном случае это было быстрее чем написать код
Viktor
но вообще это смешно, конечно, обленился совсем.
Viktor
потом дописал код уже после того как отправил ответ.
Ilia
Когда оценивают конечный результат, а не код, то почему бы и нет?:)
Viktor
Когда оценивают конечный результат, а не код, то почему бы и нет?:)
ага. в плейлисте контура мне понравилось как чувак просто wolframalpha открыл и в одну строку решил 😄
Viktor
не эту задачу, другую.
Viktor
говорит «я руководитель такого-то отдела, и как вы поняли из моей должности, программировать я не умею, но это ничего, в этой задаче это и не надо» 😄
Viktor
зачёт за humble bragging
Порридж В Ко-ливинге
Вопрос на засыпку (боюсь @alexeyten даже знает ответ): Что быстрее: arr1 = arr1.concat(arr2); или arr1.push(...arr2); ЕСЛИ ДЛИНА РАВНА: 1) 1_000_000 2) 100_000 3) 10_000
Viktor
Вопрос на засыпку (боюсь @alexeyten даже знает ответ): Что быстрее: arr1 = arr1.concat(arr2); или arr1.push(...arr2); ЕСЛИ ДЛИНА РАВНА: 1) 1_000_000 2) 100_000 3) 10_000
Интересно узнать от чего это зависит. Очевидно для разных входов будет по-разному, типа не всегда одно быстрее другого, раз ты спрашиваешь.
Порридж В Ко-ливинге
Интересно узнать от чего это зависит. Очевидно для разных входов будет по-разному, типа не всегда одно быстрее другого, раз ты спрашиваешь.
Там подвох. Там будет 3 варианта: push совсем немного быстрее concat concat нормально так быстрее push Подвох, хоть и ожидаемый
Ilia
Почувствовал себя калекой, до этого момента всегда думал, что пуш позволяет только один элемент добавить, потому что больше одного никогда не добавлял :D
Ilia
Так если в хроме дебажить, то сам предлагает (...args) ввести несколько
Я просто сейчас понял, что никогда массово не добавлял ничего через пуш, поэтому видимо и не знал
Ilia
Либо я путаю с сетом и добавлял через пуш, просто сам этого не замечал
Ilia
И правильно делал. Хотя до 50 элементов можно
Проблема в том, что если бы меня спросили бы на собеседовании об этом, я бы ответил неправильно ))))
Порридж В Ко-ливинге
Об этом бы не спросили бы
Порридж В Ко-ливинге
Спросили бы про ..., про то, как соединить 2 массива, но не про это
Viktor
Спросили бы про ..., про то, как соединить 2 массива, но не про это
так речь как раз про ... , хотя и это я считаю не стоит спрашивать на собеседовании
Порридж В Ко-ливинге
так речь как раз про ... , хотя и это я считаю не стоит спрашивать на собеседовании
Всм? Про спред операторы и ES6 всегда на скриниге спрашивают
Viktor
Всм? Про спред операторы и ES6 всегда на скриниге спрашивают
я имею в виду, что push в принципе поддерживает не один аргумент
Viktor
если ты этого не знаешь, вряд ли это означает, что ты «плохой программист»
Порридж В Ко-ливинге
так что же там начинает тормозить в ... после 50 элементов?
При 1000+ элементах concat быстрее При 1_000_000 Array.prototype.push(…) вылетает с ошибкой stackoverflow
Порридж В Ко-ливинге
Порридж В Ко-ливинге
прикол! 🔥 зачем-то рекурсивно пушит
Не рекурсией. Просто слишком большой call stack
Порридж В Ко-ливинге
Stackoverflow наверное не совсем подходит под это
Viktor
Не рекурсией. Просто слишком большой call stack
а что такое call stack по смыслу? 😉
Viktor
Кстати, видосик про вчерашнюю задачу https://www.youtube.com/watch?v=etMJxB-igrc та самая игра
Порридж В Ко-ливинге
а что такое call stack по смыслу? 😉
Ну, типо мы выгружаем слишком большое кол-во аргументов за раз
Viktor
Ну, типо мы выгружаем слишком большое кол-во аргументов за раз
я не понимаю что это значит с технической точки зрения. там написано явно исключение про call stack size exceeded, что означает, что под капотом кто-то рекурсивно что-то вызывал и стек кончился.
Viktor
«кто-то» я имею в виду сам джаваскрипт