Vyacheslav
а с ней все плохо
Vyacheslav
т.е. у luajit FSYN+FACK не схлопывается до 0x06
Snusmumriken
ну я под компилируемостью еще и оптимизацию подразумеваю.
Ок. Бери Luajit, выдирай из него TCC. Пусть пользователи будут писать "скрипты" на С, которые будут в рантайме мгновенно собираться и запускаться. https://github.com/Playermet/luajit-tcc
Vyacheslav
нет, на си писать не вариант.
Snusmumriken
Тогда изобретай свой язык. Ровно для задач "скомпилированный скрипт О(0)"
Snusmumriken
Кстати, интересно, почему его ещё не изобрели? Такая же популярная задача ))
Vyacheslav
потому что libllvm толкьо относительно недавно пошла в массы
Vyacheslav
лет через десять будет заметно, а не только в месе и постгресе
Snusmumriken
Ооо, крутяк
Aydar
нет, на си писать не вариант.
1) Берешь Lua пишешь нужную хрень, если точно не укладываешься в лимиты то переписываешь на C и объясняешь юзерам что вариантов нет.
Snusmumriken
нет, на си писать не вариант.
Ок, берёшь Lua скрипт и транслируешь в C, после чего собираешь. Ты можешь поставить любой препроцессор перед запуском, например сборку при изменениях скрипта. Первый запуск будет длиться чуть дольше (на милисекунды), но зато на выходе сишка. Лишний раз напоминаю об этом. Для сборки можешь использовать TCC выдранный из Luajit. https://github.com/davidm/lua2c
Snusmumriken
Ох блин, точно, забыл про эту дичь. https://nelua.io/
Vyacheslav
похоже по производительности разницы между pkt:tcp_set_syn(1) pkt:tcp_set_ack(1) и pkt:tcp_set_flags(tcp_flags.syn+tcp_flags.ack) то ли не будет то ли первый вариант даже побыстрее должен быть с учетом того что сумма не оптимизируется вообще никак
Snusmumriken
У тебя тут вызов методов, для производительности советую отказаться от функций и методов в принципе. Только прямой код.
Vyacheslav
Ох блин, точно, забыл про эту дичь. https://nelua.io/
и как его расширять и встраивать?
Snusmumriken
А то ещё будет pkt искать в глобал спейсе. Плюс тут явно создаётся таблица, не создавай её, нагрузка для сборщика мусора.
Snusmumriken
и как его расширять и встраивать?
С сохранением производительности? Никак.
Snusmumriken
Мы же говорим про высокую производительность а не незнамо что? Да, ты используешь строки? Где-то есть, например, расщепление строчек?
Snusmumriken
не таблица а userdata с mtatable
Происходит лукап метатаблицы в таблице индекса при вызове каждого метода, а потом поиск функции в этой метатаблице. Это медленно.
Vyacheslav
только как константы, возможно даже однократно не в цикле
Vyacheslav
ну а как быстрее?
Snusmumriken
Никак.
Snusmumriken
Писать на C.
Vyacheslav
на си не вариаент. слишком много будет болерпринта. и на плюсах тоже. плюс слишком много правил надо будет обхяснять.
Snusmumriken
Тогда не трахать себе мозги лукапами по таблицам.
Snusmumriken
Андерстендбл?
Vyacheslav
в каком месте и что вместо?
Snusmumriken
Во флагах например.
Vyacheslav
ну вот я к этому уже пришел
Snusmumriken
Сначала сделай, потом замерь. Если достаточно - забей
Vyacheslav
там всегда недостаточно будет
Snusmumriken
Тогда забей.
Vyacheslav
всегда будет хотеться с той же железки получить больше
Snusmumriken
Всё ещё забей.
Vyacheslav
за большую производительность больше заплатят
Snusmumriken
Ты хочешь слишком много, упырь мел.
Snusmumriken
Просто если ты пытаешься выжать — для тебя даже С не вариант.
Snusmumriken
Асм онли.
Vyacheslav
ха-ха-ха
Vyacheslav
нет, асм там не сильно поможет
Vyacheslav
т.е. в лучшем случае он даст несколько процентов по сравнению с си при минимум десятикратном замедлении разработки
Snusmumriken
Что важнее?
Snusmumriken
Ты же хочешь выжать БОЛЬШЕ? Значит готов мириться со скоростью разработки )
Vyacheslav
не на пару процентов
Vyacheslav
минимум процентов 50 на первой итерации.
Snusmumriken
И вот теперь, когда ты плавно отходишь от тотального тоталитарного тоталитаристического выжимания из железки максимума, ты направляешься в сторону балансирования комфорта и производительности. И тут не бывает "это медленно а это быстро" — тут используются конкретные значения и прикидка их по достаточности. Кстати, ты говорил на тему "у меня же глобальные флаги, я не хочу посвящать пользователей в тонкости" — не забывай, что ты можешь изменить require, и сделать полный набор локальных переменных в пользовательском скрипте, просто склеив строчечки с кодом а потом запустив. Операция одноразовая, так что на производительность рантайма не влияет.
Snusmumriken
Ещё, не забывай что пользователь туп и скудоумен, причём любой, включая тебя самого. Любой пользователь скриптов найдёт способ заставить всё работать в тысячу раз медленнее положеного, и хорошо если не по экспоненте экспонент.
Snusmumriken
Но если пользователь норм и знает как работает луа — он сам себе закеширует всё что ему нужно. Это не сакральная практика, это норма, так делают все пользователи во всех скриптах, кешируют переменные для ускорения доступа к ним. Любые попытки сделать оптимизации за пользователя — метание бисера перед свиньями. Пусть разбирается, это его работа. Ты сделал апи, которое МОЖНО сделать быстрым? Вот, прекрасно, пусть пользователь трахается с тем, как именно это надо делать быстрым, изучает языки, среду и всё остальное. Если он на это не способен — весь его код по умолчанию тормозное говно, и нечего пытаться его оптимизировать за него, ты не мамка и не нянька, и жопу ему не подтираешь. Вкратце: разграничивай ответственность.
Timur
т.е. у luajit FSYN+FACK не схлопывается до 0x06
Скобочки вокруг если поставить, схлопнет
Highly Likely
Вот так вот экономят на лукапах, а потом окажется, что где-нибудь есть цикл на конкатенацию миллиона строк с помощью ..
Vyacheslav
а если мне надо сгенерировать IPv4 адрес, то есть ли какая-то разница -- четыребайтовую строку возвращать из сишной функции или int? дальше это значение пойдет как аргумент из луа в другую сишную функцию.
Snusmumriken
Так что я бы делал на int'ах, с тупой функцией преобразования в тупую строку по необходимости вывода/отладки.
Vyacheslav
да не вижу тут никаких выводов. менять не собираюсь. pkt:set_src_ip(random_ip()) -- вот тут что число что строка оба иммутабельные по сути. и оба lua конструкция.
Vyacheslav
под строкой я имел ввиду бинарную четырехбайтовую строку.
Vyacheslav
числа-то double получаются, тоже все не бесплатно
Snusmumriken
да не вижу тут никаких выводов. менять не собираюсь. pkt:set_src_ip(random_ip()) -- вот тут что число что строка оба иммутабельные по сути. и оба lua конструкция.
Какие выводы следовало сделать: При обработке строк на луёвой стороне, будут создаваться новые фигулины. Если выдать пользователю строковый айпишник он будет сравнивать его с другими по маскам всяким как строки, извлекать подсети string-sub'ом и так далее, и на каждый кусочек строки будет создаваться новая строка в стрингбуфере, и требовать сборки мусора для сборки одно-двух-трёх-четырёхбайтовых строчек. Числа же будут храниться на стеке при возможности, это раз. Два — числа тупее. Три — раз ты не выдаёшь полную репрезентацию айпишника как "192.168.0.1" — лучше число.
Vyacheslav
так если я число из random_ip() верну -- тоже будет конструкция создана для передачи в сишную set_src_ip() или нет? со всякой сборкой и т.п.
Snusmumriken
Ты можешь пихнуть в луа число, а потом принять и обрабатывать его как число. Ещё ты можешь пихнуть в луа массив байт по указателю (он будет скопирован в стрингбуфер), потом принимать указатель на него обратно. Можешь скастить данные в массиве в инт. Но расходы на строки будут выше, а разницы в удобстве работы с интом, РАЗ ТЫ НЕ ДАЁШЬ СТРОКОВУЮ РЕПРЕЗЕНТАЦИЮ а ля "192.168.0.1" — не будет.
Snusmumriken
Карочи, бери инты. Под ipv6 заюзаешь cdata.
Vyacheslav
так там же не инты, там числа. которые double. тоже неудобство
Snusmumriken
А строки null-terminated
Snusmumriken
Забей, расходы на этот кусочек памяти будут выше чем на числа
Snusmumriken
Всё равно ты экономишь на спичках, если уж экономить то по полной.
Snusmumriken
Работа с числами в любом случае будет быстрее, и меньше трат на их обслуживание.
🐅🤦‍♂️
Привет. Вопрос по luajit. Как лучше передать таблицу(с установленной метатаблицей) через void* указатель data? Заголовочный файл для ffi: typedef void (*cpSpaceBodyIteratorFunc)(cpBody *body, void *data); void cpSpaceEachBody(cpSpace *space, cpSpaceBodyIteratorFunc func, void *data); Пример: local eachBody_C = ffi.cast("cpSpaceBodyIteratorFunc", function(body, data) -- тут хочу использовать data как табличку end) -- Это не нужно наверно local internal_data = ffi.new('char[1024]') local void_internal_data = ffi.cast('void*', internal_data) local function foo() C.cpSpaceEachBody(space, eachBody_C, void_internal_data) end
Snusmumriken
Фигасе запросы ))
🐅🤦‍♂️
Пример желаемого: local eachBody_C = ffi.cast("cpSpaceBodyIteratorFunc", function(body, data) local t = ??? -- вытащить из data t:someMethod() end) local function foo() local t = setmetatable(t, some_mt) C.cpSpaceEachBody(space, eachBody_C, t??) end
mva
Фигасе запросы ))
а напомни, пожалуйста, какая у нас тут ситуация по вакансиям? К кому отправлять на согласование?
Daniil
О, Elephant 🐘 Games, респект! :-) Его владелец дал мне дорогу в коммерческий геймдев. Большущий респект! :D
Polina
Elephant Games - крупная российская игровая студия. Сейчас находимся в поиске Lua Dev в команду, готовы рассматривать и без коммерческого опыта). Наш будущий коллега: Владеет языками программирования Lua, С++/С#; Умеет разбираться в чужом коде; Умеет работать в команде, способность четко укладываться в сроки. Чем предстоит заниматься: Внедрять игровые объекты и писать логику их поведения (lua); Конфигурировать игровой контент; Интегрировать звуки, текстуры и анимации; Тесно взаимодействовать с другими отделами при разработке обновлений. Плюсом будет: Опыт работы в игровой индустрии/разработка собственных прототипов. Мы предлагаем: Возможность работать удаленно или в офисе; Официальное оформление, стабильная белая зарплата; Команду влюбленных в свое дело специалистов, которые всегда помогут в сложных ситуациях и по-дружески поддержат; Прозрачность процессов и адекватный менеджмент; Компенсацию занятий спортом. Предусмотрено тестовое задание. Вопросы и отклики: @pauliinakl
Polina
Всем привет, не поздоровалась😁