Pavel
я просто вижу что код пахнет )
Snusmumriken
Чем? : )
Pavel
ну не красивый он. про варианты посмотрю. спасибо
Pavel
а в lua вызов функций дешевый?
Pavel
там не так как в с++? по значению/ссылке
Pavel
или там все inline?
Snusmumriken
Смотря в какой луа и как вызывается. Вызов глобальных фиговин где-то кроме luajit - не очень быстрый. Вызов локальных-закешированных - быстрый в любом случае. Карочи, значения в lua хранятся так: По значению: строки, числа, булеаны По ссылке: таблицы, функции, корутины, userdata. То есть, можно переопределять функции. -- сохранили ссылку на функцию в другую переменную oldprint = print function print(...) oldprint('Hai!', ...) end print(1, 2, 3, 4, 5) --> 'Hai! 1 2 3 4 5'
Snusmumriken
Строки - особая фигня, в луа используется буфер строк, чтобы быстро передавать в функции даже огромные фиговины, но это делает дорогим обилие операций, изменяющих огромные строки, ибо иммутабельность. Но в быту - норм, плюс есть трюк: local strbuf = {} for i = 1, 10000 do strbuf[#strbuf+1] = tostring(i):rep(100) end -- всё склеили в один присест, не плодились лишние строки и т.п. str = table.concat(strbuf)
Pavel
спасибо. у меня на вход идет строка - сырой html размер 200-300 к
Pavel
получается если я буду ее прокидывать в другие локальные функции - будет создаваться копия?
Snusmumriken
Нене, если ты будешь распиливать её, например, или дописывать в конец - будут создаваться новые строки, которые будут жрать почти столько же памяти сколько и оригинальная. Вот такой вариант: local str = '' for i = 1, 10000 do str = str..tostring(i):rep(100) end - очень жручий по памяти, а если ты заполнишь оперативку этими почти-копиями строки, оно будет ещё собираться мусорщиком, потом снова заполняться и снова собираться мусорщиком. Медленно. В коротких строках - быстро. В длинных и с обилием конкатенаций - быстро, пока не заполнится память.
Pavel
если не сложно можешь посмотреть на мой код сейчас ?
Pavel
http://etc2.fly-server.ru/etc/flylinkdc-search-engine.lua
Snusmumriken
Ага
Pavel
вот мой скрипт
Pavel
он зовется из С++ программы
Pavel
и туда подается 250к
Pavel
function search(p_tracker_index, p_body)
Pavel
вот сюда
Pavel
p_body - 250к
Snusmumriken
1. function get_url(i, srch, cat, page, w_word, sort, desc) if p_tracker_index == 0 then return 'http://fast-bit.org/search/'..page..'/0/300/2/'..srch end ... end => local url_list = {} url_list[0] = function(srch, cat, page) return 'http://fast-bit.org/search/'..page..'/0/300/2/'..srch end url_list[1] = function(srch, cat, page) return 'https://thepiratebay.org/search/'..srch..'/'..page..'/7//' end function get_url(i, ...) return url_list and url_list(...) or '' end
Pavel
но эти функции не получают много данных.
Snusmumriken
Превращаем однотипные if-else в табличку с функциями. Это рационально, потому что добавляя 100500-if-else ты замучаешься, плюс это можно легко в модуль вытащить и легко оперировать.
Pavel
модуль я такого не знаю еще.
Pavel
я вытгиваю скрипт полностью на клиент
Snusmumriken
2. в String2Lower очень часто используется string.char, если оно гонется на обычной lua - лучше закешировать: String2Lower = function(s) local char = _G.string.char for i = 192, 223 do s = s:gsub(char(i), char(i + 32)) end ... Это ускоряет обработку в разы, ибо не надо каждый раз заново искать функцию в глобальном пространстве, и лучше читается. Если на luajit - пофигу: скомпилирует в трассу и будет сразу машинным кодом гонять, без интерпретации.
Snusmumriken
3. Общепрограммистское: ты используешь табуляцию для форматирования. Используй табуляцию только перед текстом строки, а после хоть какого-то не-табуляционного символа - только пробелы, иначе всё едет при изменении размеров табов: [tab][tab]bla-bla[space][space]-- bla-bla [tab][tab]bla-blah[space]-- bla-bla
Pavel
кстати а для lua есть автоформатер?
Snusmumriken
Частично работает js-форматирование, по крайней мере над таблицами.
Pavel
Pavel
вот так заменил по вашему совету- результат парсинга не поменялся
Snusmumriken
Ну правильно что не поменялся, это чисто "ускорялка".
Pavel
а как вы замеряеет ускорение или замедление кода?
Pavel
профайлер есть?
Pavel
или это опыт
Snusmumriken
local time = require'socket'.gettime local timestamp = time() do_somethng() print('Time: ', time() - timestamp)
Pavel
понятно ) знакомый подход
Pavel
счас попробую
Snusmumriken
Ну, есть профилировщики, они хукают каждую функцию, смотрят сколько каждая вызывалась, сколько каждая отожрала времени и т.п.
Pavel
подскажите еще про js форматирование как его натравить на мой скрипт?
Pavel
я для C++ использую http://astyle.sourceforge.net/
Pavel
в go вообще есть свой форматер встроенный. - сразу приводит все к единому формату
Group Butler [beta]
Hi Валентина!
Group Butler [beta]
Hi Евгений!
Group Butler [beta]
Hi halt!
halt
Парни, с наступающим
halt
Можете подсказать?! Нужно из bash в Lua конвертнуть.... str=$1 num=$1 for ((i=1; i <= 8; i++)) do if [ -n "$(redis-cli MGET $str)" ] ; then zapros="$(redis-cli MGET $str)" break fi str="${str%?}" done number=${num/7/8} #Меняем 7-ку на 8-ку вырисовывается что то подобное... но видимо ошибок мильон) local str = argv; function db_check() redis.call ('MGET', "..str") end for i = 1, 8 do if db_check == 1 then local zapros = redis.call ('MGET', .. str) break end; local str = (..str%?) db_check() end
fgntfg
Есть только один способ сказать наверняка - запустить
halt
Есть, но ошибка root@orangepiplus2e:/usr/local/freeswitch/scripts# lua ./operator.lua 74955005550 lua: ./operator.lua:4: attempt to index global 'redis' (a nil value) stack traceback: ./operator.lua:4: in function 'db_check' ./operator.lua:13: in main chunk [C]: in ?
fgntfg
А у тебя redis есть?
halt
да
fgntfg
Ты его с Lua подружил?
fgntfg
Где у тебя что-то типа require('redis')?
halt
Вот в этом у меня ступор
fgntfg
Тогда ничего кроме как найти в google подходящую библиотеку я не могу посоветовать.
fgntfg
Рядом с библиотекой лежит инструкция по использованию
fgntfg
Ищи где-нибудь на github
halt
Сделал как чайник, т.е. вызов через системный redis-cli
halt
os.execute('redis-cli', 'MGET', '..str')
halt
но блин, снова ошибка в синтаксисе, но по крайней мере в базу redis обращается
Anonymous
а через local pipe = io.popen( exec , "r") можно еще stdout и stderr читать
halt
root@orangepiplus2e:/usr/local/freeswitch/scripts# lua ./operator.lua 74955005550 127.0.0.1:6379> 127.0.0.1:6379> 127.0.0.1:6379> 127.0.0.1:6379> 127.0.0.1:6379>
halt
root@orangepiplus2e:/usr/local/freeswitch/scripts# lua ./operator.lua 74955005550 lua: ./operator.lua:5: ')' expected near 'MGET'
halt
как здесь правильно прописать ? os.execute('redis-cli', 'MGET', '..str')
fgntfg
как здесь правильно прописать ? os.execute('redis-cli', 'MGET', '..str')
os.execute([command]) Execute an operating system shell command. This is like the C system() function. The system dependent status code is returned. > = os.execute("echo hello") hello 0 > = os.execute("mmmmm") — generate an error 'mmmmm' is not recognized as an internal or external command, operable program or batch file. 1 With no argument, this command returns a non-zero value if an OS shell is presents or a zero value if one is not present. > = os.execute() — no argument 1
halt
Блин, прописал уже явно os.execute(redis-cli MGET 74955005550)
halt
root@orangepiplus2e:/usr/local/freeswitch/scripts# lua ./operator.lua 74955005550 lua: ./operator.lua:5: ')' expected near 'MGET'
fgntfg
И?
fgntfg
скопипсти код сюда
fgntfg
прям строку вызова
fgntfg
Сдаётся мне ты ковычки пролюбил
halt
local str = argv; —local redis = require "redis" function db_check() os.execute(redis-cli MGET 74955005550) end for i = 1, 8 do if db_check == 1 then local zapros = os.execute(redis-cli MGET, '.. str') break end; local str = ('..str') db_check() print() end
fgntfg
так, посмотри внимательно на код который я скопипастил из вики и на сой код
fgntfg
найди отличия
fgntfg
яб так сказал что это не единственная ошибка
halt
Да я c Lua впервые столкнулся
fgntfg
наверное надо было начать с чтения какихто базовых документов по языку, чтоб понимать
fgntfg
ща, был читщит коротенький
fgntfg
http://tylerneylon.com/a/learn-lua/