Snusmumriken
Ага. И ещё как, особенно на ванильной lua. С luajit чутка попроще, но иногда (особенно на небольших циклах) воруется скорость.
Snusmumriken
Хм.
Roman
Как мне кажется, луашенька все локали запоминает в хеш локальных, а потом оттуда берет вне зависимости от уровней, local туда только добавляет, сборщик мусора убирает
B
вызов добротного куска кода на порядоченное выполнение возможет нормально только если запихать его в функцию?
Roman
Но это мне так видится в воображении по логике, в сорцы не заглядывал
B
t = {}
t.a = function()
-- выполнение поставленной задачи
end
тобишь для выполнения куска кода больших размеров иным способом как запихать все в функцию нет,
(хотя глупый вопрос, наверно же что по другому никак)
а в таблицу внедрил для удобства использования что б иметь понятие где все искать в случае необходимости
(хотя в целом странный вопрос)
Roman
Влад, читай, пожалуйста, перед отправкой, люди понять пытаются это потом
Roman
Кстати, для нубских вопросов есть паблик в вк
Snusmumriken
Хех, тут небольшая вложенность, всего три
Snusmumriken
С большей вложенностью будет хуже.
B
for i = 1, 10 do
local aru = i..'bla-bla'
...
end
в этой части не совсем понятно для каких целей выполняем конкатенацию
Snusmumriken
Так прост ))
Чтбы продемонстрировать что строка каждый раз уникальна.
Roman
а попробуй теперь local insert на самом верхнем уровне сделать и снаружи цикла, будет ли разница
Roman
я такое когда-то тестил, нет никакой разницы, луа умная очень, зря время не тратит
Roman
технически, может и есть разница размером с амебу, но погрешность gettime значительно выше
Snusmumriken
У gettime сокета практически нет погрешности, инфа сотка.
Да, я пробовал, разница маленькая, но есть.
Когда экспериментировал на lua 5.1, была офигенная разница.
Roman
Если один и тот же скрипт подряд несколько раз запускать - числа разные будут, я об этом
Snusmumriken
О, lua5.3. Разница в две секунды, это прилично. Правда, округления. Ща увеличу цикл в десять раз.
Roman
на руби ещё напиши, если делать нечего, прикола ради
Roman
будет тебе 1000 сек разницы, если комп не зависнет
Snusmumriken
Я пишу на luajit, поэтому меня это особо не касается.
Всё равно кеширую, потому что вызов table.insert из библиотеки, которая подключается другой библиотекой жрёт прилично (на ванильной), инфа сотка.
void *
на crystal надо писать :D
Snusmumriken
На haskell, без монад
Roman
А вот оффтопик js так оптимизировали, что лишний раз вынести локально из объекта - наоборот замедлит, жаль luajit до этого не дошел
Snusmumriken
Вот тебе разница побольше. Чисто за счёт кеширования. Вложенность четвёртого уровня
Snusmumriken
И luajit )))
No cashe: 2
Cached: 2
Roman
На crystal писать не надо, пока на него рельсы не перепишут. Руби === Рельсы, так что без них не нужен
void *
void *
и еще куча рельсоподобных фреймворков
Snusmumriken
void *
Roman
=== - равно "ветвления"
Snusmumriken
Боюсь что руби никому без рельсов не нужен, действительно.
Разве что идейным ювелирам-любителям, но они мало на что влияют.
За питон почти всегда платят только если он идёт вместе с django.
Жаваскрипт немыслим без node/jquerry/react и ещё кучи фреймворков.
Roman
самое сложное в рельсах - activerecord (угадайте кто переписал его на луа), и пока во фреймворке нет чего-то наподобие - значит ему ещё далеко-далеко
Roman
js мыслим без реакта, в меня вот проект на реакте кинули - вешаться хочется
Snusmumriken
Поздравляю :3
Я имею ввиду, что самостоятельный js тоже никому не нужен, нужны фреймворки.
Roman
не-не, он неплохой, мне лично нравится
Snusmumriken
Обоснование есть?
Потому что мне не нравится обилием дыр абстракций. Даже в питоне столько нет.
Чтобы что-то сделать быстрым и по-человечески - нужно очень много вкуривать.
Ну, и то что без (довольно кривых и ещё более абстрактно-дырявых) фреймворков ты никому не нужен :3
Roman
гигантский npm
Roman
сделал сборщик всего на свете, он собирает файлики, файл вотчер - есть на npm, на luarocks - врядли есть подобное, любой транслятор с одного языка на другой - есть на npm, файлы гзипать для продакшна - все есть
Roman
регекспы - лучше чем родные луашные, легче, чем lua lpeg
Snusmumriken
Библиотеки то есть. Тебе нравится то, что можно взять готовое, пусть и (иногда - далеко) не самое оптимизированное решение, и сразу его заюзать, вместо велосипедописательства.
Мне этим нравится второй питон. Третий потёк.
Roman
ООП - благодаря луашеньке вкурил, как правильно делать прототипное ООП, теперь на js для меня в этом плане все почти хорошо
Roman
и к тому же нода сильно быстрее питона, зачем тогда писать на питоне, если есть js?
Roman
он не сложнее, врядли он хуже
Snusmumriken
Зачем что-то писать на js, когда есть "регулярно" более быстрая, экономичная и менее жручая луа, где ещё и нулевой оверхед на дёрганье сишных функций через ffi? )))
В ноде это есть, но там десять оболочек вокруг, что рождает тысячи лишних джампов и переключений контекста. Медленна.
Roman
Потому что на lua пришлось бы писать тысячи вещей, которые есть на npm
Roman
а так бы с радостью
Roman
а и ещё одно важное-важное!!!!
Snusmumriken
Ну, щито поделать.
Хех, кстати у меня на работе, в lua (ванильная) встроен v8. Можно дёргать жаваскрипт-код.
Roman
асинхронность!
Snusmumriken
Ты знаешь как выглядит асинхронность? Что это такое, то есть.
Roman
знаю, как она выглядит в ноде
Roman
берешь функцию - шлешь в другую функцию, делаешь дальше что хочешь синхронно, а параллельно работает что вызвал
Roman
промисы и асинк авейты хорошо, меня колбеки пока устраивают
Roman
luvit ради этого щупал - невыносимо сырой, жаль
Snusmumriken
Это обычный эвентлуп.
Неблокирующие сокеты, например:
local udp = require'socket'.udp()
udp:settimeout(0)
udp:setsockname('*', 9000)
while true do
handler:update() -- обновление потоков, например
local data, ip, port = udp:receivefrom()
while data and ip and port do
handler:send(data, ip, port)
data, ip, port = udp:receivefrom()
end
end
Это всё. Хендлер, например, перенаправляет сообщеньки по потокам, в своём update - неблокирующе слушает потоки пока они что-то не вернут, и отправляет ответку.
TCP выглядит практически аналогично, кстати.
Roman
while true do
Roman
дальше не пустит
Snusmumriken
Хендлер, чувак )))
Всё в хендлере. Как он работает я описал, просто это не влезет в короткий пример
Roman
таки яж про асинхронность
Snusmumriken
Я ж про асинхронность.
Хендлер тоже придётся делать асинхронным и неблокирующим, только там приём со списка потоков (((
Roman
например, получить две страницы параллельно
Roman
я смотрел примеры, все это не то, зачем так делать, если для этого есть нода
Snusmumriken
Отправить запрос на пару страниц одновременно. Потоки самостоятельно вышлют ответку.
Roman
ага, по udp?
Roman
что-то не понял
Snusmumriken
Произвольно, по tcp или udp.
Ну допустим поток выглядит так:
threadfunc(data, ip, port)
page = process(data)
require'socket'.udp():sendto(page, ip, port)
end
По TCP похоже, только вместо ip/port присылается sock, и sock:send(page).
Параллельно.
Roman
в общем есть либивент и не либивент, и сравнивать их некорректно, livevent в lua - luvit - никуда не катит, отдельный себе от луа мирок заделали несовместимый
Roman
получить это receive, а sendto это отправить, я о первом, он востребованей все таки
Snusmumriken
Ну, ты просто любишь оболочки :3
А я люблю конечные автоматы.
И сделал несколько библиотек под свои нужды.
Слушай скажи мне, чем нода так крута?
На луа, можно написать простой аналог ноды, который будет выполнять все функции, ради которых ты пришёл в ноду, за несколько часов.
Правда да, количество библиотек ограничено. Точнее, с luajit - неограничено, ибо ffi и подрубание совершенно произвольных dll/so. Но не так сахарно, пока не сделаешь оболочку вокруг динамической либы.
Snusmumriken
Функция треда - представь что она выполняется на произвольном процессоре, с нерасшаренной памятью между тредами.
Snusmumriken
Кстати, память между тредами ноды общая или раздельная? Я не в курсе.
Roman
> Слушай скажи мне, чем нода так крута?
> На луа, можно написать простой аналог ноды
Кипятком от счастья писался бы, наступи такой день
Roman
нода ворвалась в 2009 по-моему, и стала такой супер известной именно благодаря этому либивенту или как его там, в других языках тоже пытались, но вышло не очень
Roman
память общая конечно!
Roman
раздельная это слишком просто
Snusmumriken
Не а.
Факт наличия общей памяти между потоками, говорит нам что потоки не совсем настоящие. Это или лёгкие потоки, или корутины.
Попробуй загрузить нодой 100% своего многоядерного процессора.
Roman
конечно не настоящие
Snusmumriken
Оу.