usernameak
Snusmumriken
Разделителем работают точки.
table.insert, string.match
Snusmumriken
А всякие tostring/tonumber это фигня.
usernameak
Snusmumriken
А, ну вот, что страшное.
usernameak
collectgarbage! (не нужен)
anton
o/ а если я создаю массив таблиц с одинаковыми ключами, эта структура данных как-то называется по особому? или это просто массив таблиц с одинаковыми ключами?
Vladislav
Можно называть как хочешь. Но на твой паттерн есть крутая оптимизация в луа: можно представить массив таблиц с одинаковым множеством ключей как хешмап массивов. Будет в разы меньше табличек, меньше нагрузка на gc
anton
anton
хешмап же имеется ввиду таблица?
Vladislav
Да
anton
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
Ага.
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.
anton
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
о, прикольно
Arslan
Snusmumriken
Нет
Sergei
Sergei
если это про мой вопрос...
Sergei
ребята, подскажите, хорошая ли едея:
луа вызывает функцию на го, она возвращает связанный список, луа бегает for'ом по структуре (связному списоку)
или лучше передавать скажем string json и тп ?
Sergei
какой lua way?
Snusmumriken
Список.
Sergei
подозреваю что я правильно мыслю, но не уверен)
Sergei
mva
Sergei
она тюнится на живую
Sergei
это сенсор определяющий ddos, нужно его программировать на лету, не трогая основной код
Sergei
он ходит в базу в которой лежит sflow статистика по трафику L2/L3 модели OSI, и делает выводы ddos/неddos )
Sergei
на го у нас это и так написано, а хочется на луа вот теперь переделать для удобства перепрограммирования
Snusmumriken
Тэкс, а почему он не должен перезапускаться, редактируясь "на лету"?
Прост патчинг на лету это хорошо, но есть проблемы того что часть мусора может оставаться в памяти, в результате неизвестно, как оно будет накатываться, как будет откатываться и где косяки. Но это лирика.
Sergei
Sergei
в которой lua запущен
Sergei
ну а перезапускаться на лету нужно потомучто ddos атаки вещь динамическая и инженер (оператор) должен подстраивать систему
Sergei
удобнее всего делать это на скриптовом языке
Sergei
ну по крайней мере я пока так думаю :)
Sergei
Sergei
это lua way, или воркэрунд для го?