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 читать
fgntfg
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/