ANTI_Finsov
ANTI_Finsov личный блог
18 февраля 2019, 12:59

Загрузка процессора на 100% от запущенного скрипта lua. Что делать?...

Коллеги, Всем добрый день!

Раньше не приходилось работать с lua.  Но здесь накатал небольшой скрипт в рамках которого происходит запросы текущей цены инструмента и запись её файл и столкнулся с проблемами производительности.
До запуска скрипта  доля нагрузки Quik-a на процессор составляла порядка 2%.
После запуска скрипта нагрузка на процессор увеличилась до 30%.   На рабочем компьютере все работает, но вот на виртуалке, где производительность ниже, всё виснет.
Ребят кто сталкивался с подобным и возможно ли оптимизация данной ситуации?

Скрипт скрипта прилагаю, но не думаю, что в нём проблема:

local stopped=false
local FileNameRead=getScriptPath().."\\poz.txt"
local FileNameWrite=getScriptPath().."\\data.txt"
local FileRead
local ID
local code
FileRead=io.open(FileNameRead,«r»)
local Read
code,ID=FileRead:read(4,"*n")
FileRead:close()
--message(code)
local ID_back=ID
local direct

function OnStop()
stopped=true
return 5000
end


function main()

local TableSI=AllocTable()
AddColumn(TableSI,1,«Дата»,true,QTABLE_DATE_TYPE,10)
AddColumn(TableSI,2,«Время»,true,QTABLE_TIME_TYPE,10)
AddColumn(TableSI,3,«Код»,true,QTABLE_STRING_TYPE,10)
AddColumn(TableSI,4,«Цена»,true,QTABLE_INT_TYPE,10)
AddColumn(TableSI,5,«Позиция»,true,QTABLE_INT_TYPE,10)

while stopped==false do
local ServerTime=tostring(getInfoParam(«SERVERTIME»))
local TradeDate=tostring(getInfoParam(«TRADEDATE»))
local SecCode=«SiH9»
local LastPrice = getParamEx(«SPBFUT», SecCode, «LAST»).param_value
local Pos=getFuturesHolding(«SPBFUT»,«SPBFUT00d8u»,SecCode,0)
if Pos~=nil then
Pos=Pos.totalnet
else
Pos=0
end
FileRead=io.open(FileNameRead,«r»)
local Read
code,ID,Read=FileRead:read(4,"*n","*n")
FileRead:close()
if(Read~=nil) then
if ID_back~=ID then
local Price
if (Read>0) then
Price=tonumber(LastPrice-LastPrice%1)*(-1)*Read
direct=1
elseif (Read<0) then
Price=tonumber(LastPrice-LastPrice%1)*math.abs(Read)
direct=-1
end
local FileWrite=io.open(FileNameWrite,«a»)
if Price~=nil then
FileWrite:write(tostring(Price).." ")
FileWrite:close()
end
sleep(1000)
ID_back=ID
end

end
end
message(«Скрипт остановлен»)
end

 

33 Комментария
  • Jame Bonds
    18 февраля 2019, 13:11
    У вас похоже sleep не там стоит. Поставьте его перед end, завершающем «while stoped»
    А если это по задумке, то поставьте там хотя бы sleep( 0 ), это капитально снизит нагрузку на процессор.
    Если sleep в цикле функции main не выполняется, то скрипт будет полностью съедать одно ядро процессора.
  • bocha
    18 февраля 2019, 13:14
    Работа с файлом в Мэйн в каждом цикле? Экспэнсив!
  • Тихий омут
    18 февраля 2019, 15:01
    смирись… LUA машина кушает один поток и все.
  • Сергей Симонов
    18 февраля 2019, 16:23
    самый тупой и простой метод отладки:

    1. последовательно комментите функции и прогоняете скрипт.
    2. смотрите, какая функция вызывает загруз проца
    3. чешете репу
    4. пишите на СЛ вопрос, если расчесали до крови, а толку — ноль

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн