mva
он гибче и расширяемее, но меня бесит двойное обращение к a
mva
неэффективно
Snusmumriken
Снус в пути
mva
кто тут был у нас опенрестифил? :)
mva
я вот тут захотел внезапно из access_by_lua (не трогая init_by_lua) закешировать между вызовами, чтобы не открывать-закрывать файл на каждый запрос, собственно, файловый дескриптор открытого файла (то, что io.open возвращает). И, что-то, вот, ни ngx.ctx не катит (lifetime=запрос) ни ngx.var (не умеет в userdata). И печаль.
vitaly
а зачем использовать io.open
vitaly
какая задача
vitaly
если что то хранить временное - читать - сдлаейте шаред словарь в шаред памяти нгинкса - один раз туда запишите и читайте - пока читалка не порвется
fgntfg
подозреваю можно из стека выдернуть аргумет передаваемый в функцию и прочие приколы. Но это упорин из области чистой сишечки
fgntfg
и код точно красивше не станет
Snusmumriken
Ну да, во-первых, обработка ошибок: for _, a in ipairs({...}) do local handler = types[type(a)] if handler then res[#res + 1] = handler(a) end end Конструкция res[#res + 1] вносит меньше искажений в визуальный фон: (меньше скобочек, (оборачивающих) (вообще (всё)))
vitaly
это типа последний елемент массива + 1
vitaly
а если просто сделать инсерт в таблицу?
vitaly
table.insert(table_name, value)
vitaly
куда попадет value ?
Snusmumriken
То будет table.insert(res, bla-bla), больше искажений в визуальном фоне, (больше скобочек, (оборачивающих) (вообще (всё)))
Snusmumriken
Это идентичные конструкции, просто одно - дёргание функции, другое - присваивание. А вот пытаться так же эмулировать table.remove из середины таблицы - не стоит, она ещё и сдвигает элементы. А удалять с конца через res[#res] = nil - можно.
vitaly
хорошо что ты не видел моего кода
vitaly
у тебя бы глаза кровью плакали
Snusmumriken
Ой всё
vitaly
Ой всё
а че ты начинаешь? 😂
Snusmumriken
За свою жизнь я видел (да и писал) очень, очень много говнокода.
Snusmumriken
Ну, относительно. В чистых луях, вызов table.insert - медленнее чем (с кешем - норм). В luajit - ваще на всё пофигу.
Vsevolod
в plain есть convention делать это через local table = table
Vsevolod
а в luajit этого делать не нужно (и даже вредно)
Vsevolod
про обычную lua если использовать local, то может быть даже быстрее
Vsevolod
local table = table ; for i=1,100500 do table.insert(t, i) end
Vsevolod
function f1(t) local t1 = util.get_ticks(true); for i=1,1000500 do table.insert(t, i) end ; local t2 = util.get_ticks(true); print(string.format("%d = %d", #t, t2 - t1)) ; end function f2(t) local t1 = util.get_ticks(true); for i=1,1000500 do t[#t+1]=i end ; local t2 = util.get_ticks(true); print(string.format("%d = %d", #t, t2 - t1)) ; end function f3(t) local table = table; local t1 = util.get_ticks(true); for i=1,1000500 do table.insert(t, i) end ; local t2 = util.get_ticks(true); print(string.format("%d = %d", #t, t2 - t1)) ; end
Vsevolod
LuaJIT 2.1.0-beta3> f1{} 1000500 = 271506156 LuaJIT 2.1.0-beta3> f2{} 1000500 = 262712687 LuaJIT 2.1.0-beta3> f3{} 1000500 = 255835000
Vsevolod
Lua 5.3> f1{} 1000500 = 389058308 Lua 5.3> f2{} 1000500 = 275793564 Lua 5.3> f3{} 1000500 = 342089621
Vsevolod
да, с local быстрее, но function invocation все равно почему-то дорогой
Vsevolod
хотя больше всего меня в таблицах бесит отсутствие в ванильном api позвать reserve, хотя в сишном lua_createtable это позволяет делать из коробки
Vsevolod
вообще, есть способ еще быстрее
Vsevolod
function f4(t) local t1 = util.get_ticks(true); for i=1,1000500 do rawset(t, i, i) end ; local t2 = util.get_ticks(true); print(string.format("%d = %d", #t, t2 - t1)) ; end
Vsevolod
1000500 = 211592588
Vsevolod
потому что в таком случае еще и метатаблицы не проверяются гарантированно
Vsevolod
а вот что действительно занятно, что в luajit f4 оказывается ощутимо медленнее всех остальных
Vsevolod
LuaJIT 2.1.0-beta3> f1{} 1000500 = 262407975 LuaJIT 2.1.0-beta3> f2{} 1000500 = 268379380 LuaJIT 2.1.0-beta3> f3{} 1000500 = 263940239 LuaJIT 2.1.0-beta3> f4{} 1000500 = 33256762
Vsevolod
хотя, судя по http://wiki.luajit.org/NYI rawset тоже компилируется
Snusmumriken
Ты это, запихивай код в тройные "`", или выделяй и жми "ctrl + shift + m". Читать куски однострочной фигни чтобы понять, чем ты там вообще тестируешь - проблемно.
Vsevolod
https://gist.github.com/vstakhov/1d91a5cb1e3107ce2c92dd206d03dcd7 - в телеграмме все равно говно
Snusmumriken
Дык тогда уж pastebin, с недельным временем хранения : )
Vsevolod
ну и да, между вызовами collectgarbage()
Vsevolod
ох ты ж, еще, оказывается, в luajit работает deepcopy для бесконечно рекурсивных таблиц, вида t = {a = 1}; t["b"] = {a = t}
Vsevolod
а вот в plain lua - не очень
Snusmumriken
В каком смысле? Где ты функцию копирования таблиц нашёл?
Vsevolod
ну, стандартная deepcopy из wiki
Vsevolod
http://lua-users.org/wiki/CopyTable
Vsevolod
я просто сегодня ощупываю tableshape от leafo (https://github.com/leafo/tableshape)
Snusmumriken
Мм. Ну я делал функцию deepcopy, которая переносит рекурсию и метатаблицы - строк за десять. Имхо это обычное дело, вне зависимости от того, luajit это или нет.
Vsevolod
и в нем куча мунскриптовых потрохов, в том числе и ООП
Snusmumriken
Ну, знаешь? DEEP-copy. В противном случае, это обычная copy : )
Snusmumriken
Вот нужно тебе скопировать объект, который содержит в себе ещё кучу объектов, у каждого из которых - ссылка на оригинальный.
Vsevolod
ну, deepcopy это в том числе и делает
Vsevolod
если ты посмотришь ссылку, что я привел
Vsevolod
но дело не в метатаблицах
Snusmumriken
А в чём? : )
Vsevolod
Lua 5.3> t = {a = 1}; t["b"] = {a = t} Lua 5.3> t {[a] = 1, [b] = {[a] = ref(0000606000958820)}} Lua 5.3> deepcopy(t) baduuum-tsss
Snusmumriken
Ну и чего?
Vsevolod
да, вот этот вот [a] = ref - это как раз ссылка на parent table
Vsevolod
того, что в luajit этого нет
Vsevolod
он просто копирует все без зависания и бесконечной рекурсии
Vsevolod
ох, все-таки я неправ. без зависания, но тоже падает, просто я этого не заметил, а с plain lua он тупил полчиса
Snusmumriken
Вот тебе рекурсивное копирование. Мы протаскиваем таблицу с ключами/значениями как оригиналами/копиями. Очень просто.
Snusmumriken
И это работает в любой актуальной версии lua (хоть и без метатаблиц, но их сюда впендюрить - как два пальца). И по хорошему, кстати, если ключ - таблица, её тоже надо копировать и пихнуть в хранилище оригиналов-копий. Чтобы чот такое тоже не вызывало проблем: tbl = {} tbl[tbl] = '10'
mva
кстати
mva
я тут хочу к тому скрипту прикрутить получение текущего стейта ориентации экрана
mva
но очень не хочу вызывать для этого io.popen('xrandr')
mva
особенно в бесконечном цикле
mva
(впрочем, ладно, можно и без цикла, всего один раз, но всё равно не хочу
mva
думал накостылять через ffi, но что-то облом
mva
в man 3 Xrandr приводят код использующий кастомные переназначенные через 8 рук типы переменных
mva
и что-то я не осилил пройти всю цепочку чтобы можно было в cdef её запихнуть 😢
Snusmumriken
Если бы я ещё работал с x-сервером.
mva
а готовых биндингов ffi в xrandr не находится 😢
mva
(и, кстати, а как такое провернуть на вяленном - вообще хз)