Snusmumriken
С вкраплениями маршмэллоу.
Snusmumriken
Snusmumriken
*намайнил*
Particle Booster
Подскажите пожалуйста, делаю так: dices, sides, taskA, taskB = string.match("4d2|math.ceil(k/2)+1", "(%d+)d(%d+)|(.+)k(.+)") print(dices, sides, taskA, taskB) i = 4 z = tostring(taskA.. i + dices - 1 ..taskB) x = loadstring("return ", z) x = x() print("=", x) как заставить его решать стринг?
Particle Booster
о! точна)
Particle Booster
Спасибо, что помогли слепому)
Particle Booster
19:15:59.367 For: 2d6>((5/2)*(3/k)+1) 19:15:59.367 19:15:59.367 Mean: 2.694 19:15:59.367 Deviation: 0.700 19:15:59.367 19:15:59.367 Normal: 19:15:59.367 2 41.667% 19:15:59.367 3 50.000% 19:15:59.367 4 5.556% 19:15:59.367 5 2.778% 19:15:59.367 19:15:59.367 At Least: 19:15:59.367 2 41.667% 19:15:59.367 3 91.667% 19:15:59.367 4 97.222% 19:15:59.367 5 100.000% 19:15:59.367 19:15:59.367 At Most: 19:15:59.367 2 100.000% 19:15:59.367 3 58.333% 19:15:59.367 4 8.333% 19:15:59.367 5 2.778% It works =)
bebebe
Кстати, я может задавал уже такой вопрос, кто-нибудь на практике использовал какие либо библиотеки фаззи серча?
Particle Booster
это точно)
Particle Booster
это корона выдает сама
Particle Booster
незнаю. Я использую свой, но не уверен, что это сильно лучше чем просто os.time. Тестировал немного, мне показалочь, что отличается результат math.randomseed( modAssay.genSeed( )) function modAssay.genSeed( ) local i, f = math.modf( os.clock( )) local clock = tonumber( tostring( i - f ):sub( 7, 9 )) if clock == nil then clock = math.random( 1, 999 ) end local time = tonumber( tostring( os.time( )):sub( 9 )) return clock + time * math.random( 1, 99 ) end
Particle Booster
методом тыка пробовал разные сочетания =)
Particle Booster
ща гляну
Particle Booster
в короне нет своего
Tverd
https://github.com/linux-man/randomlua
Roman
Привет! Не знаю зачем и почему захотелось это сделать, но есть один бенчмарк с кучей разного всякого, и луа там приуныла по позиции, и захотелось её приподнять И такая любопытная вещь: подключение к базе postgtres и mysql local time = gettime() for i = 1, 1000 do local sock = tcp() sock:connect('127.0.0.1', '5432') sock:send(auth_data) sock:receive(1) sock:close() end print(gettime() - time) Для postgres и ровно то же самое с другой строкой auth_data и портом для mysql В mysql идет больше данных, но почему-то подключение к myqsl почти в 200 раз быстрее! Как так? Что делать?
Tverd
Привет, Рома!
Tverd
бесполезный бенч... Имхо
Anonymous
само подключение или обмен данными?
Anonymous
обмена же не идет
Roman
имено подключение чтобы подключиться к базе под логином, и это занимает больше времени чем обмен
Tverd
А так - разные клиенты под постгрес и мускул, вот и разница. Оп, тупанул. Внутри авторизация разная в самих серверах
Anonymous
можно на родном постгрес клиенте проверить
Anonymous
если будешь вечером в сети
Anonymous
кинь мне линку на рабочий постгрес
Anonymous
я с сишной либы аутентифицируюсь
Roman
бесполезный бенч... Имхо
Я долго искал где именно бутылочное горлышко, и вот этот бенч его изолирует
Roman
кинь мне линку на рабочий постгрес
sock\connect('127.0.0.1', '5432') вот же она))
Tverd
Вообще мускул быстрее постгреса на простых вещах, но на тяжелых - проблема, и тут постгрес на коне. Что касается коннекта, лично на мой взгляд проблема скорее всего в авторизации, если смотреть на данный бенч
Anonymous
у меня просто постгреса нет на виртуалке
Tverd
в итоге - не луа проблема )
Tverd
что можно сделать - не рубить коннект, это плохая практика, а заюзать корутины и держать 10 (к примеру) открытых коннектов
Anonymous
коннект пул обычный подойдет тоже)
Anonymous
который на тредах
Tverd
ага, норм вариант
Roman
Ну и да, это все во nginx в openresty, получается один коннект на одного юзера, которых может быть очень много
Anonymous
а с консольки значит в 200 раз медленнее?
Anonymous
или ты прям в опенрести замерял?
Roman
Прямо в опенрести ngx.socket.tcp и отдельно require('socket').tcp - цифры такие же
Anonymous
а о каких порядках идет речь?
Anonymous
милисекунды против секунд?
Anonymous
просто вполне возможно, что постгрес аутентификация занимает например 500мс а мускл 2
Anonymous
тогда это было бы нормально
Anonymous
а вообще , мне кажется надо запилить коннекшн пул в сценарии с опенрести и не открывать больше 20-50 коннектов
Anonymous
остальные пусть в очереди ждут
Roman
странные дела, а сейчас всего в 2 раза, 3.12с vs 1.8с 1000 итераций, покопаю в сторону пула
Anonymous
3 секунды все равно дохуя
Anonymous
возможно создание 1000 tcp коннектов причастно
Roman
То то и странно! 1 коннект 0.003с, как раз одна тысячная от 3с, и это очень много, когда mysql показывал 0.00004 за коннект И вот явно какая-то фигня происходит
Anonymous
3 миллисекунды не много
Anonymous
все таки через лупбек идет
Anonymous
если бы доменные сокеты то можно было бы подумать
Roman
Может с опенрестей работали с базой? Смотрю код бенчмарка openresty lua, тут при каждом обращении к серверу создается новый инстанс, новый конекшн. И смотрю то же самое node js, один раз создался инстанс, один раз приконектился и все, все остальное время используется этот один и ему не надо никакой авторизации больше делать. При этом у ноды результат немножко лучше, если бы можно было так же в опенрести - была бы супер скорость
Anonymous
опенрести модулем nginx-а идет?
Anonymous
я просто не писал на луа, никогда
Anonymous
как луа участвует в опенрести?
Roman
Насколько я понимаю, при каждом обращении к серверу создается поток, в этом потоке запускается lua и ответ сервера формирует
Anonymous
ну, не знаю
Roman
я просто не писал на луа, никогда
советую) почему бы и нет?
Anonymous
я на си пишу
Anonymous
на работе на дотнете
Anonymous
времени не хватит на всё
Snusmumriken
Насколько я понимаю, при каждом обращении к серверу создается поток, в этом потоке запускается lua и ответ сервера формирует
У опенрести - похоже но не совсем. Если отключено кеширование - да, создаётся новый поток в котором всё инициализируется. При включённом кешировании - вроде бы луа-байткод заворачивается и сохраняется в оперативке, и по нему прогоняется обращение. При этом частично сыпятся всякие рандомы (тот сид при котором в первый раз был вызван math.randomseed), и ещё несколько косячков.
Anonymous
т.е. это не модуль нжинкса?
Snusmumriken
Модель нджинкса, где луа встроена в ядро. Это, собсно, лёгкая переделка нджинкса.
Snusmumriken
Но у нджинкса собственное довольно мощное кеширование.
Roman
Да модуль 100%, добавляет директивы, луа там обратывает реквесты То что оптимизирует и кеширует это здорово, но мы тут про sock:connect обсуждали, поток nginx на каждый реквест создает и это переиспользование сокета усложняет
Roman
вот есть ngx_postgres модуль, там наверняка не создается на каждый реквест новое соединение с базой, а для использования из луа из content_by_lua оно бесполезно, слишком оверхед большой
Snusmumriken
Везде написано, что нгинкс использует N потоков для обработки запросов, при авто - соответствующие количеству процов. Видать не пересоздаёт поток при каждом новом запросе, это слишком медленно.
Snusmumriken
Значительно быстрее гонять одну lua-state на поток, переинициализируя начальные данные/вычищая глобалспейс после выполнения скрипта, хм.
Snusmumriken
Roman
Везде написано, что нгинкс использует N потоков для обработки запросов, при авто - соответствующие количеству процов. Видать не пересоздаёт поток при каждом новом запросе, это слишком медленно.
при авто - соответствующие количеству процов Есть воркеры - это процессы, один на ядро компа, чтобы комп всеми ядрами думал И есть треды - один на клиента, чтобы они не в очереди стояли, а параллельно обрабатывались Вот Вася зашел в первый воркер и ждет данных с БД, а в это время Петя в тот же воркер зашел, пока Вася ждет, и этих потоков в nginx можно хоть десятки тысяч делать
Snusmumriken
Типа, у нас есть список соединений. Кто-то что-то прислал? Записали его запрос в список событий. Воркер закончил работу? Загрузили его новым запросом из списка событий.
Snusmumriken
При отсутствии кеширования - воркер каждый раз создаёт новую LuaState на запрос, при наличии - использует ту которая в нём была ранее.
Roman
Там скорее один луа стейт на воркер, Вася зашел и поставил глобальную переменную, а Петя потом её прочитал, если они в один воркер попали
Roman
При том что они в разных потоках были
Snusmumriken
Нельзя использовать один луастейт в разных потоках.
Roman
Почему?
Snusmumriken
Точнее, технически возможно, но будет бешеная каша вроде той которую ты сейчас описал, плюс одновременные попытки чтения/записи приводят к неопределённому поведению, всё равно что взять случайный участок памяти и попробовать оттуда что-нибудь считать.