<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Форум QUIK [тема: Сравни LUA5.3 и LUAJIT в QUIK]</title>
		<link>http://forum.quik.ru</link>
		<description>Новое в теме Сравни LUA5.3 и LUAJIT в QUIK форума  на сайте Форум QUIK [forum.quik.ru]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Sun, 03 May 2026 01:33:48 +0300</pubDate>
		<item>
			<title>Сравни LUA5.3 и LUAJIT в QUIK</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message68849/topic7979/">Сравни LUA5.3 и LUAJIT в QUIK</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Добрый день,<br />Ранее сообщал, что сделал возможность запуска скриптов QUIL &nbsp;в отдельных потоках в LUAJIT.<br />----------------<br />кратко это работает так.<br />В колбек OnParam приходят сделки инструментов, которые передаются в функцию main()<br />-----------------------<br />В main - это LUA 5.3 &nbsp;по каждому инструменту запускается скрипт алгоритма робота в отдельном потоке из пула потоков &nbsp;под LUAJIT.<br />======================<br />На просторах интернета нашел тесты по которым разработчики сравнивали MT5 &nbsp;сравнивали &nbsp;MQL5 и LUA в QUIK.<br />---------------------<br />вот сами тесты:
====code====
<pre>-- TestQuickSort
local array={}
local function QuickSort(arr,left,right)
&nbsp;&nbsp;local&nbsp;&nbsp;i=left
&nbsp;&nbsp;local&nbsp;&nbsp;j=right
&nbsp;&nbsp;local&nbsp;&nbsp;center=arr&#91;math.floor((i+j)/2)&#93;
&nbsp;&nbsp;&nbsp;&nbsp;while i&#60;=j do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(arr&#91;i&#93;&#60;center and i&#60;right) do&nbsp;&nbsp; i=i+1&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(arr&#91;j&#93;&#62;center and j&#62;left) do&nbsp;&nbsp;j=j-1&nbsp;&nbsp; end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if i&#60;=j then&nbsp;&nbsp;local&nbsp;&nbsp; x=arr&#91;i&#93;&nbsp;&nbsp; arr&#91;i&#93;=arr&#91;j&#93;&nbsp;&nbsp;&nbsp;&nbsp;arr&#91;j&#93;=x&nbsp;&nbsp;&nbsp;&nbsp; i=i+1&nbsp;&nbsp;&nbsp;&nbsp;j=j-1&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;if left&#60;j then&nbsp;&nbsp;QuickSort(arr,left,j)&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;if right&#62;i then&nbsp;&nbsp;QuickSort(arr,i,right)&nbsp;&nbsp;end
end

local function Start1()
&nbsp;&nbsp;&nbsp;&nbsp;for i=0,MAX_SIZE-1 do&nbsp;&nbsp;array&#91;i&#93;=i%100 end
&nbsp;&nbsp;&nbsp;&nbsp;start=os.clock()
&nbsp;&nbsp;&nbsp;&nbsp;QuickSort(array,0,MAX_SIZE-1)
&nbsp;&nbsp;&nbsp;&nbsp;res=(os.clock()-start)*1000
&nbsp;&nbsp;&nbsp;&nbsp;print("TestQuickSort SIZE="..MAX_SIZE..", time=" .. res .. " ms")
&nbsp;&nbsp;&nbsp;&nbsp;for i=1,MAX_SIZE-1 do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if array&#91;i&#93;&#60;array&#91;i-1&#93; then&nbsp;&nbsp;print("Array not sorted"); break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;end
end

local str=""
local a={}
local function PiCalculate(digits)
local&nbsp;&nbsp;&nbsp;d = 0
local&nbsp;&nbsp;&nbsp;c = (math.floor(digits/4)+1)*14
local&nbsp;&nbsp;&nbsp;f = 10000
&nbsp;&nbsp;&nbsp;for i=0,c do a&#91;i&#93;=20000000&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;c=c-14
&nbsp;&nbsp;&nbsp;b=c
&nbsp;&nbsp;&nbsp;while b&#62;0 do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e=d%f
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d=e
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while b-1&#62;0 do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b=b-1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d = d * b + a&#91;b&#93;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g = (b * 2) - 1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&#91;b&#93;=(d%g)*f
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d=math.floor(d/g)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r=e+math.floor(d/f)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if r&#60;1000 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(r&#62;99) then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str=str .. "0"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(r &#62; 9) then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str=str .. "00"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str=str .. "000"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str=str .. string.format("%d",r)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c=c-14
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b=c
&nbsp;&nbsp;&nbsp;end
end

function Start2()
&nbsp;&nbsp;&nbsp;start=os.clock()
&nbsp;&nbsp;&nbsp;PiCalculate(MAX_SIZE)
&nbsp;&nbsp;&nbsp;res=(os.clock()-start)*1000
&nbsp;&nbsp;&nbsp;print("TestPiCalculated SIZE="..MAX_SIZE..", time=" .. res .." ms&nbsp;&nbsp;Pi="..string.sub(str,1,16))
end

-- TestFibo

local fib={}
local function TestFibo(n)
&nbsp;&nbsp;&nbsp;if n&#60;2 then return 1 else return TestFibo(n-2)+TestFibo(n-1) end
end

local function Start3()
&nbsp;&nbsp;&nbsp;start=os.clock()
&nbsp;&nbsp;&nbsp;for i=0,MAX_SIZE-1 do &nbsp;&nbsp;&nbsp;fib&#91;i&#93;=TestFibo(i) end
&nbsp;&nbsp;&nbsp;res=(os.clock()-start)*1000
&nbsp;&nbsp;&nbsp;print("TestFibo SIZE="..MAX_SIZE..", time="..res.." ms Fibo&#91;39&#93;="..fib&#91;39&#93;)
end

-- TestArrays
local function Start4()
&nbsp;&nbsp; local&nbsp;&nbsp;x={}&nbsp;&nbsp;&nbsp;&nbsp;local y={}
&nbsp;&nbsp;&nbsp;&nbsp;local start=os.clock()
&nbsp;&nbsp;&nbsp;&nbsp;for i=1,MAX_SIZE,1 do&nbsp;&nbsp; x&#91;i&#93;=i&nbsp;&nbsp;y&#91;i&#93;=0&nbsp;&nbsp; end
&nbsp;&nbsp;&nbsp;&nbsp;y&#91;MAX_SIZE&#93;=0
&nbsp;&nbsp;&nbsp;&nbsp;for k=1,MAX_SIZE,1 do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for i=MAX_SIZE, 1,-1 do&nbsp;&nbsp;y&#91;i&#93;=y&#91;i&#93;+x&#91;i&#93; end
&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;local res=(os.clock()-start)*1000
&nbsp;&nbsp;&nbsp;&nbsp;local check=0
&nbsp;&nbsp;&nbsp;&nbsp;for k=1,MAX_SIZE,1 do check=check+y&#91;k&#93;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;print("Test Arrays SIZE="..MAX_SIZE..", Time = "..res.." ms check=".. check)
end

local function Ackermann(m,n)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(m==0) then return(n+1) end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(n==0) then return(Ackermann(m-1,1)) end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(Ackermann(m-1,Ackermann(m,(n-1))))
end

-- TestAckermann
local function Start5()
&nbsp;&nbsp;&nbsp;&nbsp;local check=0
&nbsp;&nbsp;&nbsp;&nbsp;local start=os.clock()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for i=1,MAX_SIZE do&nbsp;&nbsp;check=check+Ackermann(1+i%3,1+i%5); end
&nbsp;&nbsp;&nbsp;&nbsp;local finish=os.clock()
&nbsp;&nbsp;&nbsp;&nbsp;local res=(finish-start)*1000
&nbsp;&nbsp;&nbsp;&nbsp;print("TestAckermann SIZE="..MAX_SIZE..",time=".. string.format("%.0f",res).." ms check="..check)
end


-- TestFloat
local f0=0.0
local f1=123.456789
local f2=98765.12345678998765432
local f3=12345678943.98

function TestFloat(MAX_SIZE)
&nbsp;&nbsp;&nbsp;MAX_SIZE=MAX_SIZE-1
&nbsp;&nbsp;&nbsp;for i=0, MAX_SIZE do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for j=0, MAX_SIZE do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f0=f0+(f1/(i+1))-f2+(f3*i);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;end
end

function Start6()
&nbsp;&nbsp; local t=os.clock()
&nbsp;&nbsp; TestFloat(MAX_SIZE)
&nbsp;&nbsp; local res=(os.clock()-t)*1000
 local&nbsp;&nbsp;check=f0
&nbsp;&nbsp; print("TestFloat SIZE="..MAX_SIZE..", time=" ..res.." ms&nbsp;&nbsp;check="..tostring(check));
end


MAX_SIZE=35000; Start6()
MAX_SIZE=120000; Start5()
MAX_SIZE=32000; Start4()
MAX_SIZE=40; Start3()
MAX_SIZE=22000; Start2()
MAX_SIZE=16000000; Start1()
</pre>
=============
===================<br />На этих тестах я провел тест LUA 5.3 и LUAJIT.<br />==================<br />Результаты &nbsp;говорят сами за себя:<br />[FILE ID=10549] <br />Когда подключу MT5 к QUIK, то сделаю тест и для него.<br />-----------------------<br />Следите за новостями. <br />
			<img src="https://forum.quik.ru/bitrix/components/bitrix/forum.interface/show_file.php?fid=10549&" width="1206" height="350" /><br /><i>27.03.2023 11:30:47, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message68849/topic7979/</link>
			<guid>http://forum.quik.ru/messages/forum10/message68849/topic7979/</guid>
			<pubDate>Mon, 27 Mar 2023 11:30:47 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
	</channel>
</rss>
