Ilia
ну тут вопрос реализации самого .push
Viktor
я про это и сказал, что прикольно, что они там рекурсивно что-то под капотом пушат.
Viktor
Ну, типо мы выгружаем слишком большое кол-во аргументов за раз
call stack это всегда про вызов функции. а если он кончился, значит кто-то слишком много функций вызвал, а раз кто-то слишком много функций вызвал — скорее всего там рекурсия
Viktor
я про это
Viktor
Порридж В Ко-ливинге
// The JSArray describes JavaScript Arrays // Such an array can be in one of two modes: // - fast, backing storage is a FixedArray and length <= elements.length(); // Please note: push and pop can be used to grow and shrink the array. // - slow, backing storage is a HashTable with numbers as keys.
Порридж В Ко-ливинге
что такое запрос? ты каким терминами сейчас оперируешь? 😊
Всего один вызов. Один раз вызываем функцию. Типо мы привыкли что там 1_000_000 маленьких вызовов, а тут один большой по разрмеру как 1_000_000 маленьких
Viktor
Всего один вызов. Один раз вызываем функцию. Типо мы привыкли что там 1_000_000 маленьких вызовов, а тут один большой по разрмеру как 1_000_000 маленьких
это странная история. получается, что я на стеке не могу создать функцию с миллионом локальных переменных.
Viktor
прикольно, чё сказать.
Порридж В Ко-ливинге
Viktor
ну, точнее объявить я её могу, но не вызвать.
Порридж В Ко-ливинге
Ну вызвать 1000 тоже можно. Опять же, рекурсивно раз 1000 максимум
Порридж В Ко-ливинге
// 6. Repeat, while args is not empty. for (int i = 0; i < arg_count; ++i) { // a. Remove the first element from args and let E be the value of the // element. Handle<Object> element = args->at(i + 1); // b. Perform ? Set(O, ! ToString(len), E, true). if (length <= static_cast<double>(JSArray::kMaxArrayIndex)) { RETURN_FAILURE_ON_EXCEPTION( isolate, Object::SetElement(isolate, receiver, length, element, ShouldThrow::kThrowOnError)); } else { LookupIterator::Key key(isolate, length); LookupIterator it(isolate, receiver, key); MAYBE_RETURN(Object::SetProperty(&it, element, StoreOrigin::kMaybeKeyed, Just(ShouldThrow::kThrowOnError)), ReadOnlyRoots(isolate).exception()); } // c. Let len be len+1. ++length; }
Viktor
Ну вызвать 1000 тоже можно. Опять же, рекурсивно раз 1000 максимум
не 1000, а миллион, ну какое-то значение после которого будет max call stack size
Порридж В Ко-ливинге
не 1000, а миллион, ну какое-то значение после которого будет max call stack size
Ну у меня один раз на миллионе аргументов упало. Значит 1000 * 1000 должно упасть
Viktor
Что за Range error
тот самый max call stack size
Порридж В Ко-ливинге
тот самый max call stack size
Он там не появляется. Функция просто изначально не вызывается, т.к. аргумент слишкмо большой
Порридж В Ко-ливинге
А где модный [...arr1, ...arr2]? 🤔
Хорошая идея. Просто таким образом неопределенное кол-во аргументов за раз не склеить
Порридж В Ко-ливинге
А где модный [...arr1, ...arr2]? 🤔
Так, ну давайте, угадайте, во сколько раз быстрее или медленнее при 1_000_000 элементах?
Порридж В Ко-ливинге
Ну хотя бы быстрее или медленнее, как думаете? 😅
Порридж В Ко-ливинге
((( ~/Desktop/server/sorts: ts-node pushtest.ts arr1 = arr1.concat(arr2): 0.014033047 arr5 = [...arr5, ...arr4]: 0.131159957 ~/Desktop/server/sorts: ts-node pushtest.ts arr1 = arr1.concat(arr2): 0.013801819 arr5 = [...arr5, ...arr4]: 0.14310669 ~/Desktop/server/sorts: ts-node pushtest.ts arr1 = arr1.concat(arr2): 0.013905106 arr5 = [...arr5, ...arr4]: 0.148461756
Порридж В Ко-ливинге
В 10 раз медленнее при больших массивах
Ilia
Я пропустил про миллион
Ilia
Тогда медленнее )
Ilia
Блин, с компа минуту ждать, чтобы сообщение отправить, А с телефона 10 секунд, магия какая-то )
Порридж В Ко-ливинге
Блин, с компа минуту ждать, чтобы сообщение отправить, А с телефона 10 секунд, магия какая-то )
Хз, у меня слоумод всегда 10 сек. При 10_000 тоже медленнее: arr1 = arr1.concat(arr2): 0.000207295 arr5 = [...arr5, ...arr4]: 0.000932674
Порридж В Ко-ливинге
Даже при маленьких массивах arr1 = arr1.concat(arr2): 0.000023067 arr5 = [...arr5, ...arr4]: 0.000088995
Порридж В Ко-ливинге
Все таки как спред оператор не был бы хорош, но медот конкатенации на то и метод конкатенации.
Ilia
интересно а в обьектах как )
Порридж В Ко-ливинге
а что не вызывается? откуда-то ж берётся исключение это
Было бы у меня лишких 20 гб памяти, я бы скочал исходники Хрома и подебажил
Порридж В Ко-ливинге
интересно а в обьектах как )
Пхаха, в объектах вы иначе не сделаете. Object.assign ОЧЕНЬ ОЧЕНЬ дорогой метод. Вообще никогда не используйте его.
Viktor
Было бы у меня лишких 20 гб памяти, я бы скочал исходники Хрома и подебажил
ну понятно. где-то там в кишочках кончается место под стек 🤷‍♂️
Порридж В Ко-ливинге
function test(i, ...args){ console.log(i); test(i + 1, ...args); } ––––––––––––––––––––––––– test(0, ... new Array(100_000)) VM3946:2 0 VM3946:3 Uncaught RangeError: Maximum call stack size exceeded at test (<anonymous>:3:1) at <anonymous>:5:1
Порридж В Ко-ливинге
test(0, ... new Array(10_000)) VM3975:2 0 VM3975:2 1 VM3975:2 2 VM3975:2 3 VM3975:2 4 VM3975:2 5 VM3975:2 6 VM3975:2 7 VM3975:2 8 VM3975:2 9 VM3975:2 10 VM3975:2 11 VM3975:3 Uncaught RangeError: Maximum call stack size exceeded
Порридж В Ко-ливинге
Как я и думал. В Браузерах ограничение на 100 000 байтов
Порридж В Ко-ливинге
Т.е. можно вызвать 1 раз 100_000 или 10 раз 10_000 или 100 раз 1_000
Порридж В Ко-ливинге
121 раз при 1000 аргументах вызвалось
Порридж В Ко-ливинге
Viktor
Лол, откуда вы это число знали!?Г!
https://stackoverflow.com/questions/11332422/how-can-i-increase-the-maximum-call-stack-size-in-node-js
Порридж В Ко-ливинге
Viktor
Там нигде нет числа 121
расчёт на глазок был. если я правильно помню дефолтный размер стека метр, а число в джаваскрипте 64 битное.
Viktor
ну где-то просчитался видать
Viktor
я почему-то посчитал 121к вместо 125к
Viktor
ну и правильно. все-таки на стеке ещё служебные данные лежат, а не только аргументы мои.
Viktor
https://stackoverflow.com/questions/11332422/how-can-i-increase-the-maximum-call-stack-size-in-node-js
но если очень хочется сделать конский стек ничего не мешает передать флажок
Lynn «Кофеман»
Мне лень смотреть в кишки v8, но обычно аргументы функции кладутся на стек и положить туда миллион чисел это так себе идея
Viktor
после долгих рассуждений мы это выяснили 😃
Порридж В Ко-ливинге
+1
+2
Viktor
Как я и думал. В Браузерах ограничение на 100 000 байтов
и чтобы поставить точку в этом увлекательном исследовании, не в браузерах, а в v8. спасибо 😊
Viktor
отличный вопрос для собеседования, чтобы проверить понимает ли кандидат что такое стек и что такое куча.
Viktor
и где что хранит джаваскрипт.
Viktor
мне кажется, что это одна из первых концепций, которые изучают студенты на курсе с++
Viktor
ну, после того как немного освоились с синтаксисом
Порридж В Ко-ливинге
отличный вопрос для собеседования, чтобы проверить понимает ли кандидат что такое стек и что такое куча.
Вроде в JS тоже самое что и в плюсах. Стэк для вызовов и переменных, а куча для аллокации всякой всячины
Порридж В Ко-ливинге
всё так. потому что js написан на плюсах 😊
Не, ну они же могли что-нить хитрое придумать
Sergei
Попал на страницу выдачи Яндекса без мыши и оказывается там нет skip to main content ссылки. Я понимаю с пандусами в России все плохо, но главная выдача Яндекса - это же очень много пользователей страдает. Просто боль была скакать табом по всем ссылкам в шапке.
Sergei
Репортните там, по возможности
Viktor
а если серьезно, то я уверен делали не один подход к a11y, но это большая и сложная тема, особенно на главной странице.
Viktor
все будет, но не сейчас 😊
Порридж В Ко-ливинге
Да, нет как в Ютюбе красивой выскакивающей кнопки, но внизу показывает ссылку и видно что он это предлагает
Порридж В Ко-ливинге
В самом низу слева
Sergei
Хз я вот сейчас на маке зашёл и там первый таб вообще в Директ отправляет
Sergei
Там магия какая-то, определенно старались, это видно, но я не смог
Порридж В Ко-ливинге
Может вы попали в выборку, над которой экперементируют