<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Форум QUIK [тема: dll против Луа. Странности]</title>
		<link>http://forum.quik.ru</link>
		<description>Новое в теме dll против Луа. Странности форума  на сайте Форум QUIK [forum.quik.ru]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Tue, 21 Apr 2026 01:03:18 +0300</pubDate>
		<item>
			<title>dll против Луа. Странности</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message34086/topic3921/">dll против Луа. Странности</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_KlYrlFHJ" href="/user/12453/" bx-tooltip-user-id="12453">BlackBoar</a> написал:<br />видимо далее дорога купить исходники<br />=============<br />Ачипятка, имелось в виду &quot;курить исходники&quot;<br /><br />И <a class="blog-p-user-name" id="bp_9pUKhju0" href="/user/1801/" bx-tooltip-user-id="1801">Борис Гудылин</a>, благодарю за коммент, подтвердили ход моих мыслей :) <br />
			<i>27.09.2018 21:08:30, BlackBoar.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message34086/topic3921/</link>
			<guid>http://forum.quik.ru/messages/forum10/message34086/topic3921/</guid>
			<pubDate>Thu, 27 Sep 2018 21:08:30 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>dll против Луа. Странности</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message34085/topic3921/">dll против Луа. Странности</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_YWbixgEI" href="/user/1801/" bx-tooltip-user-id="1801">Борис Гудылин</a> написал:<br />А зачем Вам копировать в Сишный массив? Не возникало мысли работать с данными прямо по месту их нахождения?Есть, правда, некоторые трудности и даже опасности. Как минимум придется разобраться с устройством памяти в LUA, с ее динамикой и инфрастуктурой.Но оно стоит того. На моих таблицах и алгоритмах заработало примерно в 30 раз быстрее. Для меня это было жизненно необходимо.<br />=============<br />1. Неудачно выразился, в рамках примера из этой темы разумеется ничего никуда копировать не надо. Надо именно найти прямое местонахождение данных для быстрейшего к ним доступа. В других каких-то случаях наверняка придется копировать для дальнейшей обработки / изучения и тд, но абсолютно согласен с тем что все равно первоочередная задача будет получить для начала прямой доступ к этим данным.<br />2. Мысль такая после обдумывания пришла. Как получить указатель на начало этих данных из документации накурил. Ничего кроме этого полезного там не нашлось, видимо далее дорога купить исходники. Развлекаюсь пока что чтением файла lobject.h.<br />В 30 раз быстрее даже больше чем я думал, есть за что побороться )) <br />
			<i>27.09.2018 21:06:14, BlackBoar.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message34085/topic3921/</link>
			<guid>http://forum.quik.ru/messages/forum10/message34085/topic3921/</guid>
			<pubDate>Thu, 27 Sep 2018 21:06:14 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>dll против Луа. Странности</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message34083/topic3921/">dll против Луа. Странности</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			1. Вы правы.<br /><br />2. При Ваших допущениях. <br />А зачем Вам копировать в Сишный массив? Не возникало мысли работать с данными прямо по месту их нахождения?<br />Есть, правда, некоторые трудности и даже опасности. Как минимум придется разобраться с устройством памяти в LUA, с ее динамикой и инфрастуктурой.<br />Но оно стоит того. На моих таблицах и алгоритмах заработало примерно в 30 раз быстрее. Для меня это было жизненно необходимо. <br />.<br /><br /> &nbsp; <br />
			<i>27.09.2018 17:39:37, Борис Гудылин.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message34083/topic3921/</link>
			<guid>http://forum.quik.ru/messages/forum10/message34083/topic3921/</guid>
			<pubDate>Thu, 27 Sep 2018 17:39:37 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>dll против Луа. Странности</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message34076/topic3921/">dll против Луа. Странности</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Еще вопрос вдогонку, допустим про таблицу Lua заранее известно что она представляет из себя аналог Сишного массива базового типа. В примере этой конкретно темы фактически int Array&#91;20&#93;. Так вот как ее бычтрее всего закопировать в Сишный массив чтобы дальше с ним уже работать традиционным образом?<br />Получать каждый отдельный элемент вызывая в цикле<br />
====code====
<pre>lua_rawgeti(L, 1, i);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
sum += lua_tonumber(L, -1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
lua_pop(L, 1);</pre>
=============
выглядит откровенно расточительно. Какие-то более эффективные способы есть? Сам не нашел пока... <br />
			<i>27.09.2018 01:51:49, BlackBoar.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message34076/topic3921/</link>
			<guid>http://forum.quik.ru/messages/forum10/message34076/topic3921/</guid>
			<pubDate>Thu, 27 Sep 2018 01:51:49 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>dll против Луа. Странности</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message34075/topic3921/">dll против Луа. Странности</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_ZUzzQlL0" href="/user/3905/" bx-tooltip-user-id="3905">Let_it_go</a> написал:<br />Вот функция на Си++ внутри dll. Она принимает таблицу и выдаёт обратно в Луа сумму элементов этой таблицы<br />
====code====
<pre>static int forLua_SumArray(lua_State* L) {
&nbsp;&nbsp; // Get the length of the table (same as # operator in Lua)
&nbsp;&nbsp; int n = lua_objlen(L, 1);
&nbsp;&nbsp; double sum = 0.0;
&nbsp;&nbsp; // For each index from 1 to n, get the table value as a number and add to sum
&nbsp;&nbsp; for (int i = 1; i &#60;= n; ++i) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lua_rawgeti(L, 1, i);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum += lua_tonumber(L, -1);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lua_pop(L, 1);
&nbsp;&nbsp; }

&nbsp;&nbsp; lua_pushnumber(L, sum);
&nbsp;&nbsp; return 1;
}</pre>
=============
Я ожидаю, что чем больше элементов будет в таблице, тем сильнее dll должна опережать аналогичные подсчёты в Луа.<br />=============<br />Вот такого плана код на С++. Здесь каждая содержательная строчка производит ту или иную манипуляцию со стеком Lua. То есть, в моем представлении, такой код фактически будет исполняться на том же самом интерпретаторе Lua как если бы он был написан непосредственно на Lua. И его быстродействие должно всегда оказываться по порядку величины сравнимым с Lua. Если он вообще на сколько-то быстрее уже хорошо.<br />Я прав? (в луа мало что понимаю поэтому спрашиваю) <br />
			<i>27.09.2018 00:07:41, BlackBoar.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message34075/topic3921/</link>
			<guid>http://forum.quik.ru/messages/forum10/message34075/topic3921/</guid>
			<pubDate>Thu, 27 Sep 2018 00:07:41 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>dll против Луа. Странности</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message32934/topic3921/">dll против Луа. Странности</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<a class="blog-p-user-name" id="bp_2AaWHPA8" href="/user/2282/" bx-tooltip-user-id="2282">Алексей Ч</a>, <br />в предложенном вами варианте Луа равна по скорости dll на Си<br />
====code====
<pre>function sum_new(t)--функция Алексея Ч.
&nbsp;&nbsp;&nbsp;&nbsp;local sum = 0
&nbsp;&nbsp;&nbsp;&nbsp;for x=1, #t do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum = sum + t&#91;x&#93;
&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;return sum
end
iterations=1000000
function main ()
&nbsp;&nbsp;&nbsp;t={}
&nbsp;&nbsp;&nbsp;for i=1,20 do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table.insert(t,i)
&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;start=os.clock()
&nbsp;&nbsp;&nbsp;for i=1,iterations do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s=runfast.SumArray(t)--функция из dll
&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;finish_dll=os.clock()-start
&nbsp;&nbsp;&nbsp;mm("dll:"..finish_dll)
&nbsp;&nbsp;&nbsp;start=os.clock()
&nbsp;&nbsp;&nbsp;for i=1,iterations do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s=sum(t)--старая функция на Луа с for... pairs
&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;finish_lua=os.clock()-start
&nbsp;&nbsp;&nbsp;mm("Lua:"..finish_lua)&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;start=os.clock()
&nbsp;&nbsp;&nbsp;for i=1,iterations do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s=sum_new(t)--новая функция без pairs
&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;finish_lua_new=os.clock()-start&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;mm("Lua new:"..finish_lua_new)
&nbsp;&nbsp;&nbsp;mm("Lua old slower:"..math_round((finish_lua/finish_dll),1))
&nbsp;&nbsp;&nbsp;mm("Lua new slower:"..math_round((finish_lua_new/finish_dll),1))&nbsp;&nbsp;&nbsp;
end</pre>
=============
<br /><img src="http://dl4.joxi.net/drive/2018/08/26/0011/1313/742689/89/0debea8c5a.png" alt="Пользователь добавил изображение" border="0" /> <br />
			<i>26.08.2018 12:07:57, Let_it_go.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message32934/topic3921/</link>
			<guid>http://forum.quik.ru/messages/forum10/message32934/topic3921/</guid>
			<pubDate>Sun, 26 Aug 2018 12:07:57 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>dll против Луа. Странности</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message32933/topic3921/">dll против Луа. Странности</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Отвечу вопросом на вопрос. А почему Вы решили, что dll должно давать преимущество в скорости? &quot;Общеизвестный факт&quot; при проверке оказывается мифом. <br />
			<i>26.08.2018 11:51:26, Алексей Ч.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message32933/topic3921/</link>
			<guid>http://forum.quik.ru/messages/forum10/message32933/topic3921/</guid>
			<pubDate>Sun, 26 Aug 2018 11:51:26 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>dll против Луа. Странности</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message32932/topic3921/">dll против Луа. Странности</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<a class="blog-p-user-name" id="bp_Bz2IFbXh" href="/user/2282/" bx-tooltip-user-id="2282">Алексей Ч</a>, <br />спасибо. Я не знал, что предложенный вами вариант будет быстрее. Обязательно начну использовать.<br />---<br />Но ваш комментарий о другом. Я про другое спросил. Почему dll не даёт преимущества в скорости на больших таблицах? Почему при обсчёте таблицы с 20 полями и таблицы с 40 полями разница в производительности одинаковая? &nbsp; <br />
			<i>26.08.2018 11:34:48, Let_it_go.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message32932/topic3921/</link>
			<guid>http://forum.quik.ru/messages/forum10/message32932/topic3921/</guid>
			<pubDate>Sun, 26 Aug 2018 11:34:48 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>dll против Луа. Странности</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message32931/topic3921/">dll против Луа. Странности</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Ну какие странности!?! С луа Вы почему то используете медленный for pairs, а в С++ быстрый for...<br /><br />Попробуйте такую формулу для lua
====code====
<pre>function sum(t)
&nbsp;&nbsp;&nbsp;&nbsp;local sum = 0
&nbsp;&nbsp;&nbsp;&nbsp;for x=1, #t do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum = sum + t&#91;x&#93;
&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;return sum
end
</pre>
=============
P.S. Народ тут в поисках скорости в многопоточности и dll на плюсах совсем не видит, что миллион раз сладывает одно и тоже. Понимаю,что код во втором листинге делает это в качестве теста. Но посмотрите внимательно на свой &quot;рабочий&quot;, нет ли там того же самого <br />
			<i>26.08.2018 11:14:48, Алексей Ч.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message32931/topic3921/</link>
			<guid>http://forum.quik.ru/messages/forum10/message32931/topic3921/</guid>
			<pubDate>Sun, 26 Aug 2018 11:14:48 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>dll против Луа. Странности</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message32930/topic3921/">dll против Луа. Странности</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			На всякий случай код функции sum, которая считает сумму элементов на Луа:<br />
====code====
<pre>function sum(t)
&nbsp;&nbsp;&nbsp;&nbsp;local sum = 0
&nbsp;&nbsp;&nbsp;&nbsp;for k,v in pairs(t) do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum = sum + v
&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;return sum
end</pre>
============= <br />
			<i>25.08.2018 22:20:48, Let_it_go.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message32930/topic3921/</link>
			<guid>http://forum.quik.ru/messages/forum10/message32930/topic3921/</guid>
			<pubDate>Sat, 25 Aug 2018 22:20:48 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>dll против Луа. Странности</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message32929/topic3921/">dll против Луа. Странности</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Вот функция на Си++ внутри dll. Она принимает таблицу и выдаёт обратно в Луа сумму элементов этой таблицы.<br />
====code====
<pre>static int forLua_SumArray(lua_State* L) {
&nbsp;&nbsp;&nbsp;// Get the length of the table (same as # operator in Lua)
&nbsp;&nbsp;&nbsp;int n = lua_objlen(L, 1);
&nbsp;&nbsp;&nbsp;double sum = 0.0;
&nbsp;&nbsp;&nbsp;// For each index from 1 to n, get the table value as a number and add to sum
&nbsp;&nbsp;&nbsp;for (int i = 1; i &#60;= n; ++i) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lua_rawgeti(L, 1, i);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum += lua_tonumber(L, -1);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lua_pop(L, 1);
&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;lua_pushnumber(L, sum);
&nbsp;&nbsp;&nbsp;return 1;
}</pre>
=============
Я ожидаю, что чем больше элементов будет в таблице, тем сильнее dll должна опережать аналогичные подсчёты в Луа.<br />Написал код для сравнения скорости.
====code====
<pre>iterations=1000000
function main ()
&nbsp;&nbsp;&nbsp;t={}
&nbsp;&nbsp;&nbsp;for i=1,20 do--вставляем в таблицу 20 элементов
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table.insert(t,i)
&nbsp;&nbsp;&nbsp;end
--гоняем цикл миллион раз
&nbsp;&nbsp;&nbsp;start=os.clock()
&nbsp;&nbsp;&nbsp;for i=1,iterations do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s=runfast.SumArray(t)
&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;finish_dll=os.clock()-start
&nbsp;&nbsp;&nbsp;mm("dll:"..finish_dll)
--гоняем цикл миллион раз
&nbsp;&nbsp;&nbsp;start=os.clock()
&nbsp;&nbsp;&nbsp;for i=1,iterations do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s=sum(t)
&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;finish_lua=os.clock()-start
&nbsp;&nbsp;&nbsp;mm("Lua:"..finish_lua)
&nbsp;&nbsp;&nbsp;mm("Lua slower:"..math_round((finish_lua/finish_dll),1))
end</pre>
=============
<img src="http://dl4.joxi.net/drive/2018/08/25/0011/1313/742689/89/16917c5a93.png" alt="Пользователь добавил изображение" border="0" /><br />Луа медленнее в 2,4 раза. Я мучаюсь с Си ради роста скорости в 100 раз, ну да ладно. В 2,5 раза тоже кое-что. Сказываются транспортные издержки при перекидывании данных между Си и Луа.<br />************************<br />А теперь удивительное для меня. Заполняю таблицу 40 элементами. 	
====code====
<pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t={}
&nbsp;&nbsp;&nbsp;for i=1,40 do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table.insert(t,i)
&nbsp;&nbsp;&nbsp;end</pre>
=============
Значит внутри Си++ будет производиться в 2 раза больше операций и она сможет лучше проявить своё преимущество в скорости по сравнению с Луа.<br />Но нет: при 40 элементах в таблице преимущество Си в скорости такое же.<br /><br /><img src="http://dl4.joxi.net/drive/2018/08/25/0011/1313/742689/89/6b79047767.png" alt="Пользователь добавил изображение" border="0" /><br /><br />Почему?<br />Я думал, что чем больше таблица, тем быстрее будет работать вариант кода с dll.<br />Объясните пожалуйста. <br />
			<i>25.08.2018 22:18:55, Let_it_go.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message32929/topic3921/</link>
			<guid>http://forum.quik.ru/messages/forum10/message32929/topic3921/</guid>
			<pubDate>Sat, 25 Aug 2018 22:18:55 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
	</channel>
</rss>
