Сергей
а за какую асимптотику работает?
UtoECat
rxi_json кстати на это обращает внимание
но тогда это нечестное сравнение получается 😁 С доп-проверками и без проверок либы сравнивать. Конечно без проверок будет быстрее.
UtoECat
json.decode читает как может json.encode записывает как правильно
я про чтение. реализация этого - банальный счётчик хотя-бы. На начале массива/объекта инкрементить, в конце - декрементить. По окончанию парсинга проверяем, что счётчик равен нулю.
Luсky
Денис
Всех приветствую что ли? Да..
UtoECat
Всех приветствую что ли? Да..
Добрый вечер. Каков ваш вопрос?)
Laimadoo
Реп будет?
Конечно. Только доведу до ума, что бы и рыбку скушать и... рыбку скушать
Денис
Добрый вечер. Каков ваш вопрос?)
Да так, просто увидел, что этот чат есть в тг и зашёл сюда
UtoECat
Оно на чистом луа молотит? А версия lua какая?
rxi json вам не достаточно по скорости? 🤔 Или вы за фичу "читает как может"?
Laimadoo
Оно на чистом луа молотит? А версия lua какая?
Можно как на lua5.1 так и на lua5.3, на других не проверял. Потом может гляну отличия и будет более обширная поддержка
Laimadoo
Laimadoo
Во всех моментах проверил, везде быстрее. Хотя иногда отрыв мал, а это значит всё же нужно будет поработать над кодом усерднее
Laimadoo
Laimadoo
Так что определённо есть куда расти
Laimadoo
Стек вложенных функций в lua5.1: 16379
Laimadoo
В luajit: 21821
Laimadoo
В C: 261974
Laimadoo
Зачем вам эта информация? Не знаю, но прикольно же
Laimadoo
в lua5.4: 499985
Snusmumriken
Дефолтные значения перетираются при сборке, при желании
Сергей
Snusmumriken
что это означает?
Через столько рекурсивных вызовов, луашка упадёт с переполнением стека, если ты покакаешь с хвостовой рекурсией.
Сергей
а стек разве ограничивается (по крайней мере в Си) кол-вом вызовов функции? я думал она ограничивается размером памяти, из-за чего кол-во вызовов будет разное для разных функций
Snusmumriken
Лично я начинаю напрягаться когда стек разрастается до 6-8 вызовов.
Сергей
ну я про это и говорю
Сергей
но размер стека разве считают в кол-вах вызовов функций?
Snusmumriken
Дефолтный размер стека вызовов у сишки собранной VS — 1мб, например.
Сергей
ну мегабайты, да
Сергей
не кол-во вызовов функций
Snusmumriken
не кол-во вызовов функций
В этот "мб" помещается строго определённое количество вызовов функций, исходя из стоимости по памяти одного вызова.
UtoECat
но размер стека разве считают в кол-вах вызовов функций?
Потому что компиляторы не скажут тебе сколько места на стеке займёт хоть в лучшем хоть в худшем случае вызов функции. Да и считать геморнее в рантайме такое
Сергей
линкеру даешь /stack:100500 и он тебе ровно столько байтов выделяет жи
Snusmumriken
да ну
Парень. Ты знаешь что такое "дефолтные значения"?
Сергей
окей, я понял
Snusmumriken
В луашке вон тоже можно сказать "сделай мне стек на 40000000000 вызовов"
Snusmumriken
У линуксовых компиляторов могут быть другие дефолтные значения. Но да, каждый вызов функции тоже потребляет кусочек памяти.
UtoECat
Потому что компиляторы не скажут тебе сколько места на стеке займёт хоть в лучшем хоть в худшем случае вызов функции. Да и считать геморнее в рантайме такое
Tbh, можно было-бы вычитать с указателя конца стека текущий stack pointer, но это сложннее, чем кажется, если брать в расчёт то, что по стандарту в си никакого стека может и не быть вообще. Да и всё равно рантайм проверка...
Сергей
У линуксовых компиляторов могут быть другие дефолтные значения. Но да, каждый вызов функции тоже потребляет кусочек памяти.
но тейк в том, что и в линуксе и в винде чётко ограничивается кол-во рекурсивных вызовов и оно не зависит от самой функции (не зависит от тяжести этой функции), верно?
Snusmumriken
Не зависит. Но количество "локальных" переменных тоже ограничено.
Laimadoo
не кол-во вызовов функций
В lua вроде кол-вом функций
Snusmumriken
В луа именно количеством функций.
Сергей
Нет, не от количества. Но количество вызовов - хорошая апроксимация.
ну Снус говорит, что в Си от количества конкретно
Laimadoo
В lua вроде кол-вом функций
Типо ты туда хоть текст, хоть цисло, хоть что передовай, будет одинаково
Сергей
и Снус подтвердил, что не зависит
Snusmumriken
Это кстати надо проверить, куда пихаются локалки в сишке. Если в тот же стек что и вызовы функций, то от "количества локалок" тоже зависит.
Сергей
вот я тоже думаю что пихается
Сергей
ща проверять буду
UtoECat
Это кстати надо проверить, куда пихаются локалки в сишке. Если в тот же стек что и вызовы функций, то от "количества локалок" тоже зависит.
Локалки? Да. Но не всегда. Что-то компилятор может соптимизировать, например, в регистры или .data/.rdata
Snusmumriken
вот я тоже думаю что пихается
Но в простейшем виде, стек это личерали указатель на "goto из функции". В него в любом случае складируются указатели "куда должны переместиться когда эта функция закончится".
Snusmumriken
Локалки? Да. Но не всегда. Что-то компилятор может соптимизировать, например, в регистры или .data/.rdata
Вопрос про данный конкретный стек который использует сишка для хранения указателей выхода, стеков может быть много для разных целей.
Сергей
int cnt = 0; void f() { cnt += 1; f(); } int main() { f(); } - 524092 вызова перед сдыханием int cnt = 0; void f(int a, int b, int c) { cnt += 1; f(a + 1, b + 1, c + 1); } int main() { f(1, 2, 3); } - 262046 вызовов перед сдыханием копилировал g++ main.cpp -O0 -g -o main
Laimadoo
Не зависит. Но количество "локальных" переменных тоже ограничено.
Логично, но это уже блин не проверить ручным способом
Laimadoo
хотя...
Сергей
стек
Snusmumriken
Какой из ))
Сергей
если сделать ulimit -s unlimited то очень долго ничего не сдыхает
UtoECat
Теперь осталось понять, что именно мы переполнили.
Если не ошибаюсь - в винде разделение стеков на отдельные с указателями и отдельные с локалками и vla - опциональная фича, не включённая по дефолту... Пардон это gcc
Snusmumriken
Вот тут я не в курсе потому что не сишник.
Laimadoo
Какой из ))
типо стек переданных аргументов или вызванных рекурсивных функций?
UtoECat
Вот тут я не в курсе потому что не сишник.
В gcc по идее стек только один. Общий.
Snusmumriken
Осталось понять как он отличает локалки от goto-шек.
UtoECat
Осталось понять как он отличает локалки от goto-шек.
Stack Base Pointer? Хотя он тоже опционален, но тогда машинный код должен явно pop-нуть со стека всё, что положил ( в gcc это -fomit-frame-pointer опция)