Snusmumriken
Разделителем работают точки. table.insert, string.match
Snusmumriken
А всякие tostring/tonumber это фигня.
Snusmumriken
А, ну вот, что страшное.
usernameak
collectgarbage! (не нужен)
anton
o/ а если я создаю массив таблиц с одинаковыми ключами, эта структура данных как-то называется по особому? или это просто массив таблиц с одинаковыми ключами?
Vladislav
Можно называть как хочешь. Но на твой паттерн есть крутая оптимизация в луа: можно представить массив таблиц с одинаковым множеством ключей как хешмап массивов. Будет в разы меньше табличек, меньше нагрузка на gc
anton
хешмап же имеется ввиду таблица?
Vladislav
Да
Snusmumriken
Можно называть как хочешь. Но на твой паттерн есть крутая оптимизация в луа: можно представить массив таблиц с одинаковым множеством ключей как хешмап массивов. Будет в разы меньше табличек, меньше нагрузка на gc
Это называется "паралельные массивы". Оно занимает меньше памяти, но требует куда больше усилий на удаление/вставку структур, потому что надо сдвинуть все значения во всех массивах после вставляемого (table.insert и table.remove — медленные, а тут оно умножается на количество полей). Комфорт использования — близок к нулевому. Расширяемость новыми полями тоже страдает, если какие-то поля пусты — образуются дырки, от которых ничего хорошего. Такую штуку можно делать только если у тебя совершенно конкретная цель.
Snusmumriken
Можно, но всё равно медленно.
Snusmumriken
Плюс размер строковых ключей в луа у однотипных объектов не имеет значения.
Snusmumriken
Десять тысяч объектов { longlongkey1 = "foo", longlongkey2 = "bar", } Будут иметь объём только собственных значений "foo" и "bar", плюс пары указателей на строки "longlongkey1" и "longlongkey2". Луа использует строковый буфер, так что экономия памяти на параллельных массивах минимальна. Да, одинаковые строки (в т.ч. строковые ключи) существуют в памяти только в единственном экземпляре (и собираются мусорщиком, когда на них заканчиваются ссылки), а по луа-коду гуляют указатели на них. Лайфхак: у луа очень, очень быстрое сравнение строк: просто проверка указателей на одинаковость ))
Snusmumriken
По этим же причинам, кстати, нельзя менять отдельные части строки, типа str[2] = "f".
anton
ясно, спасибо, теперь я знаю об этом явлении с разных сторон
anton
получается 10000 таких объектов будут занимать места на 160 кбайт больше, чем параллельные массивы, т.е. 8 x 2 x 10000 ?
Snusmumriken
Примерно так, да. Ещё чуть-чуть на саму табличку, она тоже занимает маленький кусочек памяти.
anton
о, значит 240 кб
Snusmumriken
Карочи, делай пока как "удобно". Как "круто" — будешь делать когда тебе действительно приспичит.
anton
да, согласен. если не смерджат, заставят переделывать, тогда переделаю
Snusmumriken
В любом случае, на любые извращения обязательно идут дополнительные расходы, за крайне редким исключением.
Snusmumriken
Нормально
Arslan
> Лайфхак: у луа очень, очень быстрое сравнение строк: просто проверка указателей на одинаковость )) То есть перед тем как создать строку, луа сверяет ее содержимое с другими и возвращает ссылку?
Snusmumriken
Луа хеширует содержимое и сравнивает со списком хешей->указателей на другие строки. Да.
Arslan
TString **p = G(L)->strcache[i]; for (j = 0; j < STRCACHE_M; j++) { if (strcmp(str, getstr(p[j])) == 0) /* hit? */ return p[j]; /* that is it */ } Мдээ... И стоит оно того?
Snusmumriken
Ага.
Snusmumriken
TString **p = G(L)->strcache[i]; for (j = 0; j < STRCACHE_M; j++) { if (strcmp(str, getstr(p[j])) == 0) /* hit? */ return p[j]; /* that is it */ } Мдээ... И стоит оно того?
Это имеет определённые проблемы в luajit'е, там функция хеширования строк затрагивает только четыре(!) символа в них, в результате если у тебя в памяти миллиард почти одинаковых строк, то скорость работы с ними замедляется в тысячи раз. В ванильной луа такого нет. Но в целом, оно очень сильно экономит память. Ну смотри блин, размер десятков тысяч структур с кучей полей — зависит только от количества ключей а не их длины.
Sergei
Подскажите, как в lua вызывать функции из основной программы (go-lua в моем случаи) что-то не могу понять
Sergei
За ссылки буду благодарен )
Sergei
это у меня работает )
Sergei
мне теперь нужно из lua вызвать гошную функцию
Sergei
и возврат гошной функции обработать в lua :)
Sergei
пока я нашел только решение в виде lua модуля, который под капотом .so, но это на си...
Sergei
и не ужели нету удобного варианта какого-то
Sergei
Sergei
видимо так...
Sergei
но это для gopher-lua, а у меня go-lua
Sergei
буду пробовать, но если кто сталкивался - буду благодарен за помощь
Sergei
а SetGlobal разве не то?
Sergei
есть еще SetFunctions
Sergei
func SetFunctions(l *State, functions []RegistryFunction, upValueCount uint8)
Sergei
судя по всему для go-lua это так делается
Sergei
это как раз и скармливается потом SetFunctions
Sergei
судя по всему
Sergei
тут нету случайно желающих помочь с опенсорс проектом по защите от ddos? есть часть на go-lua
Sergei
оплатим хорошо :) ну и опенсорс для кармы тоже хорошо
Sergei
уже разбираюсь
Snusmumriken
Кароч, я объясняю сишную апишку, найдёшь гошные алиасы. Для вызова луашных функций (любых), есть lua_call, lua_pcall и lua_xpcall. Это не самый быстрый процесс, но какой есть. Для проброса функций в луа есть lua_pushcfunction + lua_setglobal (и ещё всякие luaL_register для проброса сразу пачки), луа быстро вызывает внешние функции.
anton
o/ а если мне нужно сделать push_back в массив, лучше использовать table.insert или array[last+1] = ...
Не заморачивайся и делай читабельнее, т.е. table.insert.
Snusmumriken
Я делаю arr[#arr + 1] = ..., но мне так больше нравится, ибо короче и отсутствуют оборачивающие скобки, получается читаемей при большом выражении, типа: arr[#arr + 1] = "Foo " .. getStuff() .. " bar" .. getOther() arr[#arr + 1] = {foo = "bar", bar = "baz"} Для сравнения: table.insert(arr, "Foo " .. getStuff() .. " bar" .. getOther()) table.insert(arr, {foo = "bar", bar = "baz"})
Snusmumriken
Ещё можно взломать систему и сделать local arr = setmetatable({}, {__index = table}) И дальше хачить: arr:insert("foo") arr:insert{foo = "bar", bar = "baz"}
anton
о, прикольно
Snusmumriken
Нет
Sergei
если это про мой вопрос...
Sergei
ребята, подскажите, хорошая ли едея: луа вызывает функцию на го, она возвращает связанный список, луа бегает for'ом по структуре (связному списоку) или лучше передавать скажем string json и тп ?
Sergei
какой lua way?
Snusmumriken
Список.
Sergei
подозреваю что я правильно мыслю, но не уверен)
Sergei
Список.
спасибо)
Sergei
почему это не сделать на стороне go?
потомучто это та вещь которую надо программировать без перезапуская ядра на го
Sergei
она тюнится на живую
Sergei
это сенсор определяющий ddos, нужно его программировать на лету, не трогая основной код
Sergei
он ходит в базу в которой лежит sflow статистика по трафику L2/L3 модели OSI, и делает выводы ddos/неddos )
Sergei
на го у нас это и так написано, а хочется на луа вот теперь переделать для удобства перепрограммирования
Snusmumriken
Тэкс, а почему он не должен перезапускаться, редактируясь "на лету"? Прост патчинг на лету это хорошо, но есть проблемы того что часть мусора может оставаться в памяти, в результате неизвестно, как оно будет накатываться, как будет откатываться и где косяки. Но это лирика.
Sergei
в которой lua запущен
Sergei
ну а перезапускаться на лету нужно потомучто ddos атаки вещь динамическая и инженер (оператор) должен подстраивать систему
Sergei
удобнее всего делать это на скриптовом языке
Sergei
ну по крайней мере я пока так думаю :)
Sergei
это lua way, или воркэрунд для го?