Работает, но на большом файле у него парсер упал.
Mark ☢️
Основатель QEMU и FFmpeg опубликовал JavaScript-движок QuickJS https://opennet.ru/51079/
Andrey
Всем привет! Подскажите как правильно на lua нужно делать preexecute метод? Например для проверки времени сессии.
Andrey
Что бы не пихать вызов метода во все остальные.
Snusmumriken
Хммм, давай подробнее, что конкретно хочешь. Preexecute это слишком узкая штука. Ты хочешь проверить время исполнения функции, или что-то такое?
Snusmumriken
Ну кароч расскажи об окружении, в чём используешь луа. И примерчик, желательно.
Snusmumriken
Гипотетически, на все вызовы всех луёвых функций можно повесить хуки (либа debug), но это очень сильно замедляет процесс.
Andrey
Есть контроллер (обьект) и несколько десятков методов в нем. Мне надо перед вызовом каждого метода проверить сессию пользователя. И если все гуд - выполнить метод. А если не гуд - вернуть ошибку.
Snusmumriken
1. Хуки 2. Почему бы не проверить сессию перед использованием объекта? Или сессия может измениться между вызовами, когда вызывается несколько методов подряд?
Snusmumriken
Потому что проверка сессии — это довольно длительный процесс, обычно надо лезть в какую-нибудь базу, и если ты будешь дёргать кучу методов этого объекта за короткий промежуток времени — можешь чутка перегрузить её.
Andrey
1. погуглю 2. библиотека не моя не охота туда лесть, в чужой код и что то подменять
Snusmumriken
https://www.lua.org/pil/23.2.html
Snusmumriken
Ещё можно совсем тупо обернуть все методы в ещё один слой функций: for k, v in pairs(object) do if k ~= "new" and type(v) == 'function' then object[k] = function(...) if not checkSession(blabla) then return nil, "session is lost" end return v(...) end end end Многоточие — это такой оператор для функций "с любым количеством аргументов", если что.
Andrey
так. а без дебаг мода если. например в начале контроллера я бегу по всем методам и собираю их в массив потом строю свой массив с такими же
Andrey
подменяю название и ссылаюмь метотаблицей
Snusmumriken
Вот это почти то что я дал в качестве примера тупого оборачивания. Правда, если у данного объекта есть метатабличный класс — лучше обернуть так класс.
Andrey
понял, спасибо!
Snusmumriken
И не трогай метод new или аналог, во. Тебе же не надо проверять сессию в случае если ты создаёшь такой объект?
Andrey
нет. сессия проверяется уже в методах
🐅🤦‍♂️
Основатель QEMU и FFmpeg опубликовал JavaScript-движок QuickJS https://opennet.ru/51079/
Не понял, в статье есть таблица бенчмарков. А сравнение QuickJS с v8 есть?
Snusmumriken
Его только опубликовали
Snusmumriken
С другой стороны, он ориентирован на встраивание. Это значит что к нему легко делать биндинги. Было бы круто если бы организация этих биндингов была схожей с луёвым встраиванием, ибо проще я ещё ничего не видел. Правда, тогда потеряется совместимость с сишными расширениями для ноды и всякого такого.
Mark ☢️
https://www.lua.org/pil/23.2.html
Прикольно. А идея вызывать гц каждые ххх инструкций это зло ?
Mark ☢️
Суть неизлечимая -- много памяти в юзердатах, которые луа не видит
Snusmumriken
Прикольно. А идея вызывать гц каждые ххх инструкций это зло ?
Это торговля процессорным временем за постоянное поддержание памяти в чистоте.
Snusmumriken
С юзердатами — достаточно повесить на них метаметод __gc, тогда луа будет их собирать.
Mark ☢️
Но она недопетривает что уже пора
Snusmumriken
А ещё можно сделать как в ловке: специальный метод obj:release(), который мгновенно освобождает память занимаемую объектом, правда им больше нельзя пользоваться, угадай почему.
Mark ☢️
У него нет такой фигни
Snusmumriken
А ты чаво там, на микроконтроллерах сидишь?
Snusmumriken
Потому что дёргать collectgarbage в конце каждого цикла и каждой функции — это в основном следствие использования nodemcu. Ааа, вспомнил, ты там на роутерах с опенврт, ясно всё ))
Snusmumriken
Во, вспомнил. Возможно получится дёргать напрямую getmetatable(obj).__gc(obj), но не уверен что это не приведёт ни к каким последствиям, типа двойного вызова free, что может освободить память из уже несуществующего места, размеченного под что-то ещё.
Egor
Подскажите, как писать на луа? Имеет ли вообще смысл писать в кучу файликов с одной(двумя) функциями (как псевдо ООП), ну кроме исключительных случаев?
Egor
хмм. кажется опять сумбурно как-то мысли изложил
Snusmumriken
Кхм. Ну если ты мутишь небольшое приложение, получается файл main строк на двести, который подключает кучу либ. Либы, в идеале — абстрагированы от всего остального и могут многократно использоваться в разных проектах в т.ч. соло.
Serezha
Основатель QEMU и FFmpeg опубликовал JavaScript-движок QuickJS https://opennet.ru/51079/
Прикольно хотя подвинуть DukTape сложно будет
Egor
Кхм. Ну если ты мутишь небольшое приложение, получается файл main строк на двести, который подключает кучу либ. Либы, в идеале — абстрагированы от всего остального и могут многократно использоваться в разных проектах в т.ч. соло.
у меня просто есть парочку функций, которые используются в разных либах, поэтому одна либа подгружает другую либу и тд.. но мне как-то кажется неправильно немного
Serezha
А кто прогает на опенрести, вот эта проблема актуальна с шаблонами?
Serezha
There is also a regression in LuaJIT that affects the results. If you want your LuaJIT patched against this, you need to merge this pull request: https://github.com/LuaJIT/LuaJIT/pull/174.
Snusmumriken
Ну если ты не планируешь это давать кому-то ещё — это ок. utils.lua main.lua --> require"class_foo", require'class_bar' class_foo.lua --> require'utils' class_bar.lua --> require'utils'
Egor
Ну если ты не планируешь это давать кому-то ещё — это ок. utils.lua main.lua --> require"class_foo", require'class_bar' class_foo.lua --> require'utils' class_bar.lua --> require'utils'
у меня что-то типа такого и выходит, а давать я буду уже забандленный код, собранный в один файл
Egor
просто в игре есть ограничения на размер.
Snusmumriken
Вот такая фигня — это ок, для личных вещей или конкретного проекта. Если выдавать class_foo/class_bar по отдельности другим людям, эффективнее запихнуть utils вутрь, потому что народу неудобно подгребать два файла.
Egor
вот и подумал, что мини файлы и его забандливание поможет минифицировть
Snusmumriken
Так, стоп, прости, а какое у тебя там ограничение на размер? 20кб под код?
Egor
Так, стоп, прости, а какое у тебя там ограничение на размер? 20кб под код?
кажется сейчас больше, так как файлы весят около 40 кб и норм
Egor
я про 20кб только слышал от других, сам не сталкивлся
Snusmumriken
А в чём прекол? Пишешь под pico8?
Egor
А в чём прекол? Пишешь под pico8?
наверное нет, так как я не знаю что это
Egor
нет, не под него
Snusmumriken
Если прям так уж нужно минифицировать — объединяешь все-все либы в один файл по типу *common.lua* local m = {} m.play = function() ... end -- ещё миллиард функций m.funcname local g = {} g.draw = function() ... end -- ещё миллиард функций g.funcname local M = {} M.music = m M.graphic = g return M А потом такой: local framework = require'common' framework.music.play(...) framework.graphic.draw(...) Во-первых, один большой файл проще сжимать чем много маленьких, во-вторых типа всё подключается в одном месте, в третьих — удобно для переноса под другие штуки.
Snusmumriken
Ага.
Snusmumriken
Разумеется, но у тебя ограничения по памяти на жёстком диске, а не в оперативной памяти?
Egor
Хотя я думаю, попробую избавиться от вложенных либ, а то когда делаю бандл, описывать все как-то сложно, так как автоматический поиск ломается, из-за ссылок на несуществующие либы
Snusmumriken
Если ты хочешь своими маленькими модулями сэкономить оперативную память — то оно так не работает. Луа кеширует каждый модуль который ты подгружал через require. То есть, вызвав require'utils' в двух местах — в первый раз оно подгрузит и выполнит скрипт, закешировав всё что он вернул, а во второй раз — вернёт кеш того что возвращал в первый раз.
Snusmumriken
Ты там кажись чот слишком сложное мутишь ))
Egor
Ты там кажись чот слишком сложное мутишь ))
кажется так. слишком буквально понял про ограничения. =)
Egor
надо вечерком попробовать упростить код
Snusmumriken
Ещё интересно, что там за бандлы такие. Если это условно архивы, с модифицированным require, умеющим лазать по архивам и цапать из них скрипты — один файл под всё ещё эффективнее, потому что хорошо жмётся. Одни и те же символьные шаблоны в разных модулях — остаются одними и теми же, плюс deflate может найти ещё что-то общее и сжать круче чем кучу мелких файлов. Плюс один хедер.
Snusmumriken
Ну, амальгам не минифицирует, насколько я знаю, а только объединяет, надо глянуть.
Max
А кто прогает на опенрести, вот эта проблема актуальна с шаблонами?
проблема не актуальна ровно до тех пор, пока всё работает за ожидаемое время. но на самом деле это бомба замедленного действия, на которой сидят все, кто юзает непатченный luajit. (пример можно смотреть здесь: https://youtu.be/64c4ihDl6MM?t=1956)
Max
собственно тут ровно такая же проблема, если использовать luajit: https://t.me/ProLua/51202
Snusmumriken
Ну, ещё можно парсить xml полностью, а парсить потоком, чтобы в памяти перманентно не находилось миллиарда строк с одинаковой хеш-функцией. Вопрос исключительно в кол-ве "почти-одинаковых" строк в строковом буфере.
Snusmumriken
Ну так-то ещё оно могло точно так же сломаться, если бы изменился xml. Правда, оно не положило бы сервер а тупо скрипт упал бы с ошибкой : )
Snusmumriken
Ну, знаешь, когда ты пишешь код эффективный для luajit, ты пишешь больше прямых циклов без лишних условий и стараешься описать математикой то, что обычно описывается иначе. Как раз потому что luajit лучше всего оптимизирует прямые циклы (собирает их в трассы) и лучше работает с математикой.
Snusmumriken
Есть такая штука как "закон дырявых абстракций": http://local.joelonsoftware.com/wiki/Закон_Дырявых_Абстракций. Если ты знаешь где дырка — подстелишь соломки. Эти товарищи молодцы что исследовали это дело, и я теперь пишу более эффективный luajit-код, который не падает из-за одинаковых строк, потому что я выдираю из них уникальные части и работаю с ними.
Max
не надо усложнять и завуалировать простейший факт — в luajit очень-очень-очень плохая хэш-функция для интернирования строк
Snusmumriken
Да, эта проблема есть, равно как и проблема со сборкой мусора : )
Snusmumriken
И мы все про неё знаем, и работаем с учётом этого.
Snusmumriken
К счастью, таких дыр в lua и luajit мало, потому что они сами по себе маленькие. Нужно не так много осознать, чтобы писать достаточно эффективно.