<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[QUIK -> DDE &mdash; Скорость работы Lua vs С++]]></title>
	<link rel="self" href="https://quik2dde.ru/extern.php?action=feed&amp;tid=161&amp;type=atom" />
	<updated>2015-07-31T21:13:51Z</updated>
	<generator>PunBB</generator>
	<id>https://quik2dde.ru/viewtopic.php?id=161</id>
		<entry>
			<title type="html"><![CDATA[Re: Скорость работы Lua vs С++]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=1548#p1548" />
			<content type="html"><![CDATA[<p>Наконец, я подошёл к тому, для чего всё затевалось: к работе с массивом данных в C++.</p><p><strong>Calc_SMA.lua</strong></p><div class="codebox"><pre><code>local sScriptPath = getScriptPath()
package.path = sScriptPath..&#039;\\?.lua;&#039;..package.path
require(&#039;mod_lua&#039;)
package.cpath = sScriptPath..&#039;\\?.dll;&#039;..package.cpath
require(&#039;mod_cpp&#039;)

function main()
  -- Засекаем время:
  local nClock = os.clock()
  -- Считываем данные из файла и заносим их в массив в памяти в виде свечей
  local sError = mod_lua.CreateCandles(&#039;R:\\data.csv&#039;)
  -- Если функция завершилась с ошибкой, выводим сообщение об ошибке и выходим:
  if sError then message(sError, 3) error(sError, 0) end
  -- Выводим время работы функции:
  message(string.format(&#039;Чтение данных (Lua): %0.1f сек&#039;, os.clock()-nClock), 2)

  nClock = os.clock()
  sError = mod_cpp.CreateCandles(&#039;R:\\data.csv&#039;)
  if sError then message(sError, 3) error(sError, 0) end
  message(string.format(&#039;Чтение данных (C++): %0.1f сек&#039;, os.clock()-nClock), 2)

  nClock = os.clock()
  -- Расчитываем индикатор и заносим значения в массив
  -- Расчёт будет вестись юпо параметру Weighted Close (&#039;W&#039;)
  -- Дополнительно передаём стартовое время и ID таблицы для вывода хода расчёта
  mod_lua.CalcSMA(50, &#039;W&#039;)
  -- Выводим время работы функции:
  message(string.format(&#039;Расчёт индикатора (Lua): %0.1f сек&#039;, os.clock()-nClock), 2)

  nClock = os.clock()
  mod_cpp.CalcSMA(50, &#039;W&#039;)
  message(string.format(&#039;Расчёт индикатора (C++): %0.1f сек&#039;, os.clock()-nClock), 2)
end</code></pre></div><p><strong>mod_lua.lua</strong></p><div class="codebox"><pre><code>-- Заголовок файла с данными свечей:
local sHeader = &#039;&lt;TICKER&gt;,&lt;PER&gt;,&lt;DATE&gt;,&lt;TIME&gt;,&lt;OPEN&gt;,&lt;HIGH&gt;,&lt;LOW&gt;,&lt;CLOSE&gt;,&lt;VOL&gt;&#039;
local io_open, os_time, os_clock, pcall = io.open, os.time, os.clock, pcall
local string_format, string_match = string.format, string.match
local SetCell = SetCell

module(&#039;mod_lua&#039;)

-- Обявляем массивы для хранения значений индикатора и данных свечей:
local tSMA, tCandles = {}, {}

function CreateCandles(sFileName)
-- Функция чтения файла данных
  local hFile, sError = io_open(sFileName, &#039;r&#039;)
  if not hFile then return false, sError end
  local sLine = hFile:read()
  if sLine ~= sHeader then
    -- Если заголовок файла неверный - выходим с ошибкой:
    sError = &#039;Неверный заголовок в файле &quot;&#039;..sFileName..&#039;&quot;: &quot;&#039;..(sLine or &#039;nil&#039;)..&#039;&quot;&#039;
  else
    local tData, tPrice, nNum = {}, {}
    for sLine in hFile:lines() do
        -- Парсим считанную строку:
        local Year, Month, Day, Hour, Min, Sec, Open, High, Low, Close, Volume = string_match(sLine, &#039;^[^,]+,%d+,(%d%d%d%d)(%d%d)(%d%d),(%d?%d)(%d%d)(%d%d),(%d+%.?%d-),(%d+%.?%d-),(%d+%.?%d-),(%d+%.?%d-),(%d+)&#039;)
        nNum, Close = (nNum or 0) + 1, Close+0
        -- Заносим в массив в виде свечей:
        tCandles[nNum] = {Open+0, High+0, Low+0, Close, Volume+0}
    end
  end
  hFile:close() hFile = nil
  return sError
end
local function _GetValue(data, sParam)
-- Функция получения значения заданного параметра из массива данных
-- (Close, Open, High, Low, Volume, Median Price, Typical Price, Weighted Close)
  if not sParam or sParam == &#039;C&#039; then return data[4]
  elseif sParam == &#039;O&#039; then return data[1]
  elseif sParam == &#039;H&#039; then return data[2]
  elseif sParam == &#039;L&#039; then return data[3]
  elseif sParam == &#039;V&#039; then return data[5]
  elseif sParam == &#039;M&#039; then return (data[2] + data[3]) / 2
  elseif sParam == &#039;T&#039; then return (data[2] + data[3] + data[4]) / 3
  elseif sParam == &#039;W&#039; then return (data[2] + data[3] + 2*data[4]) / 4
  else return data[4] end
end
local function SMA(nIndex, nPeriod, tData, sParam)
-- Расчёт среднего значения по заданному периоду
  if nIndex &lt; nPeriod then return nil end
  local nSum = 0
  for i = nIndex-nPeriod+1, nIndex do
    nSum = nSum + _GetValue(tData[i], sParam)
  end
  return nSum / nPeriod
end
function CalcSMA(nPeriod, sParam, nClock, hID)
-- Расчёт простой скользящей средней
  for nIndex = 1, #tCandles do
    -- Заносим полученное значение в массив:
    tSMA[nIndex] = SMA(nIndex, nPeriod, tCandles, sParam)
  end
end</code></pre></div><p><strong>mod_cpp.cpp</strong></p><div class="codebox"><pre><code>#include &lt;windows.h&gt;
#include &lt;fstream&gt;
#include &lt;vector&gt;

// в случае вызова функций из LUA-кода во внешней DLL
// необходимо определить эти константы до подключения заголовочных файлов LUA
#define LUA_LIB
#define LUA_BUILD_AS_DLL

// заголовочные файлы LUA из дистрибутива LUA
extern &quot;C&quot; {
  #include &quot;../contrib/lauxlib.h&quot;
  #include &quot;../contrib/lua.h&quot;
}

// стандартная точка входа для DLL
BOOL APIENTRY DllMain(HANDLE hmod_cppule, DWORD  ul_reason_for_call, LPVOID lpReserved) {
  return TRUE;
}

using namespace std;

vector&lt;vector&lt;double&gt; &gt; aData;
vector&lt;double&gt; aSMA;

double _GetValue(vector&lt;double&gt; &amp;data, const char *sParam) {
// Функция получения значения заданного параметра из массива данных
// (Close, Open, High, Low, Volume, Median Price, Typical Price, Weighted Close)
  switch (*sParam) {
    case NULL:
      return data[3];
    case &#039;C&#039;:
      return data[3];
    case &#039;O&#039;:
      return data[0];
    case &#039;H&#039;:
      return data[1];
    case &#039;L&#039;:
      return data[2];
    case &#039;V&#039;:
      return data[4];
    case &#039;M&#039;:
      return (data[1] + data[2]) / 2;
    case &#039;T&#039;:
      return (data[1] + data[2] + data[3]) / 3;
    case &#039;W&#039;:
      return (data[1] + data[2] + 2*data[3]) / 4;
    default:
      return data[3];
  }
}

double _SMA(const unsigned int &amp;iIndex, const unsigned short int &amp;iPeriod, vector&lt;vector&lt;double&gt; &gt; &amp;aData, const char *sParam) {
// Расчёт среднего значения по заданному периоду
  if (iIndex &lt; iPeriod-1) return NULL;
  double nSum = 0;
  for ( size_t i = iIndex-iPeriod+1; i&lt;=iIndex; i++ ) {
    nSum = nSum + _GetValue(aData[i], sParam);
  }
  return nSum / iPeriod;
}

// реализация функций, вызываемых из LUA

static int lua_CalcSMA(lua_State *L) {
// Расчёт простой скользящей средней
  const unsigned short int iPeriod = luaL_checknumber(L, 1);
  const char *sParam = lua_tostring(L, 2);
  for ( size_t i=0; i&lt;aData.size(); i++ ) {
    // Заносим полученное значение в массив:
    aSMA.push_back(_SMA(i, iPeriod, aData, sParam));
  }
  lua_pushnil(L);
  return(1);
}

static int lua_CreateCandles(lua_State *L) {
  const char *sFileName = lua_tostring(L, 1);
  ifstream hFile (sFileName);
  if (!hFile.is_open()) lua_pushstring(L, &quot;Не удалось открыть файл&quot;);  // Как добавить сюда имя файла?
  else {
    char sLine[100];
    hFile &gt;&gt; sLine;
    if (strcmp(sLine, &quot;&lt;TICKER&gt;,&lt;PER&gt;,&lt;DATE&gt;,&lt;TIME&gt;,&lt;OPEN&gt;,&lt;HIGH&gt;,&lt;LOW&gt;,&lt;CLOSE&gt;,&lt;VOL&gt;&quot;) != 0) {
      lua_pushstring(L, &quot;Неверный заголовок в файле&quot;);  // Как добавить сюда имя файла и считанную строку?
    } else {
      char s;
      double n;
      vector&lt;double&gt; v;
      while (!hFile.eof()) {
        if ( !hFile.get(sLine, 99, &#039;,&#039;) ) break;
        for ( size_t i=0; i&lt;=2; i++ ) hFile &gt;&gt; s &gt;&gt; n;
        for ( size_t i=3; i&lt;=7; i++ ) {
          hFile &gt;&gt; s &gt;&gt; n;
          v.push_back(n);
        }
        hFile.get();
         aData.push_back(v);
        v.clear();
      }
      lua_pushnil(L);
    }
    hFile.close();
  }
  return(1);
}

// регистрация реализованных в dll функций, чтобы они стали &quot;видимы&quot; для LUA

static struct luaL_reg lib_functions[] = {
    {&quot;CreateCandles&quot;, lua_CreateCandles},
    {&quot;CalcSMA&quot;, lua_CalcSMA},
    {NULL, NULL}
};

extern &quot;C&quot; LUALIB_API int luaopen_mod_cpp(lua_State *L) {
    luaL_openlib(L, &quot;mod_cpp&quot;, lib_functions, 0);
    return 0;
}</code></pre></div><p><strong>Результаты:</strong><br /><em>Чтение данных (Lua): 2.0 сек<br />Чтение данных (C++): 2.8 сек<br />Расчёт индикатора (Lua): 6.9 сек<br />Расчёт индикатора (C++): 0.0 сек</em></p><p>Как и предполагалось, C++ работает с массивами немного пошустрее Lua. К слову, в Lua - скорость бработы с массивами является узким местом.<br />Осталось ещё ускорить чтение данные из файлов.</p><p>PS: Предыдущие результаты чтения файла были следствием компиляции библиотеки в конфигурации Debug. Текущий результат - в Release.</p>]]></content>
			<author>
				<name><![CDATA[CyberTrader]]></name>
				<uri>https://quik2dde.ru/profile.php?id=248</uri>
			</author>
			<updated>2015-07-31T21:13:51Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=1548#p1548</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Скорость работы Lua vs С++]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=1547#p1547" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>mbul пишет:</cite><blockquote><p>на самом деле, тут речь уже не о быстродействии Lua vs. C++. В примерах соревнуются std-контейнеры и С. да и с контейнерами можно работать оптимальнее.</p></blockquote></div><p>Как? Если знаете, подскажите.</p>]]></content>
			<author>
				<name><![CDATA[CyberTrader]]></name>
				<uri>https://quik2dde.ru/profile.php?id=248</uri>
			</author>
			<updated>2015-07-31T11:08:54Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=1547#p1547</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Скорость работы Lua vs С++]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=1546#p1546" />
			<content type="html"><![CDATA[<p>на самом деле, тут речь уже не о быстродействии Lua vs. C++. В примерах соревнуются std-контейнеры и С. да и с контейнерами можно работать оптимальнее.<br />P.S.<br />Ради интереса запустил код под профилировщиком:<br /><span class="postimg"><img src="http://i.imgur.com/JJfzk1E.png" alt="http://i.imgur.com/JJfzk1E.png" /></span></p>]]></content>
			<author>
				<name><![CDATA[mbul]]></name>
				<uri>https://quik2dde.ru/profile.php?id=89</uri>
			</author>
			<updated>2015-07-31T08:49:37Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=1546#p1546</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Скорость работы Lua vs С++]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=1544#p1544" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>mbul пишет:</cite><blockquote><p>Это, скорее, ifstream так медленно работает.</p></blockquote></div><p>Но нам ведь мало прочитать файл. Надо ещё сохранить прочитанные значения в массив.<br />Вот функция на C++:</p><div class="codebox"><pre><code>#include &lt;fstream&gt;
#include &lt;vector&gt;

using namespace std;

vector&lt;vector&lt;double&gt; &gt; aData;

static int lua_CreateCandles(lua_State *L) {
  const char *sFileName = lua_tostring(L, 1);
  ifstream hFile (sFileName);
  if (!hFile.is_open()) lua_pushstring(L, &quot;Не удалось открыть файл&quot;);  // Как добавить сюда имя файла?
  else {
    char sLine[100];
    hFile &gt;&gt; sLine;
    if (strcmp(sLine, &quot;&lt;TICKER&gt;,&lt;PER&gt;,&lt;DATE&gt;,&lt;TIME&gt;,&lt;OPEN&gt;,&lt;HIGH&gt;,&lt;LOW&gt;,&lt;CLOSE&gt;,&lt;VOL&gt;&quot;) != 0) {
      lua_pushstring(L, &quot;Неверный заголовок в файле&quot;);  // Как добавить сюда имя файла и считанную строку?
    } else {
      char s;
      double d;
      vector&lt;double&gt; v;
      while (!hFile.eof()) {
        if ( !hFile.get(sLine, 99, &#039;,&#039;) ) break;
        for ( size_t i=0; i&lt;=2; i++ ) hFile &gt;&gt; s &gt;&gt; d;
        for ( size_t i=3; i&lt;=7; i++ ) {
          hFile &gt;&gt; s &gt;&gt; d;
          v.push_back(d);
        }
        hFile.get();
        aData.push_back(v);
        v.clear();
      }
      lua_pushnil(L);
    }
    hFile.close();
  }
  return(1);
}</code></pre></div><p>Результат таков:<br /><strong>Lua</strong>: 2.4 сек<br /><strong>C++</strong>: 18.4 сек</p><p>И это ещё без проверки правильности формата считываемых строк. В Lua эта проверка делается одним оператором.</p><p>Возможно, на C++ можно и быстрее, но пока так...</p>]]></content>
			<author>
				<name><![CDATA[CyberTrader]]></name>
				<uri>https://quik2dde.ru/profile.php?id=248</uri>
			</author>
			<updated>2015-07-31T07:43:53Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=1544#p1544</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Скорость работы Lua vs С++]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=1531#p1531" />
			<content type="html"><![CDATA[<p>Это, скорее, ifstream так медленно работает.</p><div class="codebox"><pre><code>#include &quot;stdafx.h&quot;
using namespace std;
void read_fopen ( const char* f_name )
{
    FILE* fp = NULL;
    fopen_s ( &amp;fp, f_name, &quot;rt&quot; );
    if ( fp )
    {
        char line[1024];
        while ( !feof ( fp ) )
        {
            fgets ( line, 1023, fp );
        }
        fclose ( fp );
    }
    else
        return;
}
void read_ifstream ( const char* fname )
{
    ifstream hFile ( fname ); //Открываем файл для считывания информации
    if ( hFile.is_open() ) {
        char sLine[1024];  //В sLine будут считываться строки
        while ( !hFile.eof() ) { //Будем читать информацию пока не дойдем до конца файла
            hFile &gt;&gt; sLine;  //Построчное считывание информации в sLine
        }
        hFile.close();  // Закрываем файл
    }
    else
        return;
}
int _tmain ( int argc, _TCHAR* argv[] )
{
    const char f_name[MAX_PATH] = &quot;D:\\data.txt&quot;;
    int MAX_N = 100;
    long start = GetTickCount();
    for ( int i = 0; i &lt; MAX_N; i++ )
    {
        read_fopen ( f_name );
    }
    long end = GetTickCount();
    printf ( &quot;read_fopen : %d ticks\n&quot;, end - start );

    start = GetTickCount();
    for ( int i = 0; i &lt; MAX_N; i++ )
    {
        read_ifstream ( f_name );
    }
    end = GetTickCount();
    printf ( &quot;read_ifstream : %d ticks\n&quot;, end - start );

}</code></pre></div><p>На моей машине вот такой результат:<br /><strong>read_fopen : 7300 ticks<br />read_ifstream : 17519 ticks</strong></p>]]></content>
			<author>
				<name><![CDATA[mbul]]></name>
				<uri>https://quik2dde.ru/profile.php?id=89</uri>
			</author>
			<updated>2015-07-29T01:55:03Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=1531#p1531</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Скорость работы Lua vs С++]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=1527#p1527" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>mbul пишет:</cite><blockquote><p>Если хотите значительно повысить быстродействие, то необходимо максимально исключить передачу данных через стек Lua в хост-программу.</p></blockquote></div><p>У меня данные считываются &quot;внутри&quot; модуля и &quot;наружу&quot; не передаются. В нём же расчитывается индикатор.</p><div class="quotebox"><cite>mbul пишет:</cite><blockquote><p>И по алгоритму расчета средней. Если у Вас всегда средняя считается для всех индексов массива последовательно, то можно изменить алгоритм значительно его ускорив даже в чистом Lua. Для этого можно использовать замыкание и запоминать уже посчитанное значение средней на предыдущем индексе. Это даст хороший прирост скорости на больших интервалах.</p></blockquote></div><p>Согласен: правильно написанный алгоритм позволяет ускорить вычисления в разы. Но речь сейчас не про оптимизацию алгоритма расчёта, а про скорость работы с массивом данных в принципе. В качестве примера я взял &quot;классический&quot; SMA.</p><p>Начал писать модуль на C++:</p><div class="codebox"><pre><code>static int lua_CreateCandles(lua_State *L) {
  const char * sFileName = lua_tostring(L, 1);
  ifstream hFile (sFileName);  //Открываем файл для считывания информации
  if (hFile.is_open()) {
    char sLine[100];  //В sLine будут считываться строки
    while (!hFile.eof()) {  //Будем читать информацию пока не дойдем до конца файла
      hFile &gt;&gt; sLine;  //Построчное считывание информации в sLine
    }
    hFile.close();  // Закрываем файл
    lua_pushstring(L, NULL);
  }
  else {
    lua_pushstring(L, &quot;Не удалось открыть файл&quot;);  // Как сюда добавить имя файла?
  }
  return(1);
}</code></pre></div><p>Результат меня не радует: файл с виртуального диска в оперативной памяти считывается за 3.7 сек, при том что в Lua этот же файл считывается за 0.3 сек (вместе с парсингом и заполнением массива операция занимает 3.0 сек).<br />Это нормально, что в C++ так медленно? Или я что-то не так делаю?</p>]]></content>
			<author>
				<name><![CDATA[CyberTrader]]></name>
				<uri>https://quik2dde.ru/profile.php?id=248</uri>
			</author>
			<updated>2015-07-28T18:25:05Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=1527#p1527</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Скорость работы Lua vs С++]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=1526#p1526" />
			<content type="html"><![CDATA[<p>Добрый день.<br />Если хотите значительно повысить быстродействие, то необходимо максимально исключить передачу данных через стек Lua в хост-программу. В Вашем случае, наверное, оптимально было бы написать как минимум две функции:<br />1. функция загрузки данных из файла в память хост-программы<br />2. расчет индикатора на уже сформированных данных.<br />И по алгоритму расчета средней. Если у Вас всегда средняя считается для всех индексов массива последовательно, то можно изменить алгоритм значительно его ускорив даже в чистом Lua. Для этого можно использовать замыкание и запоминать уже посчитанное значение средней на предыдущем индексе. Это даст хороший прирост скорости на больших интервалах.</p>]]></content>
			<author>
				<name><![CDATA[mbul]]></name>
				<uri>https://quik2dde.ru/profile.php?id=89</uri>
			</author>
			<updated>2015-07-28T00:42:35Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=1526#p1526</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Скорость работы Lua vs С++]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=1525#p1525" />
			<content type="html"><![CDATA[<p>Как я понял, участники данной темы, не изучив представленный для теста код, сразу вынесли свой &quot;приговор&quot;.<br />Добавил комментарии, чтобы было понятней.</p><br /><p><strong>sam063rus</strong>,<br /></p><div class="spoilerbox" style="padding: 0px;"><div onclick="var e,d,c=this.parentNode,a=c.getElementsByTagName('div')[1],b=this.getElementsByTagName('span')[0];if(a.style.display!=''){while(c.parentNode&&(!d||!e||d==e)){e=d;d=(window.getComputedStyle?getComputedStyle(c, null):c.currentStyle)['backgroundColor'];if(d=='transparent'||d=='rgba(0, 0, 0, 0)')d=e;c=c.parentNode;}a.style.display='';a.style.backgroundColor=d;b.innerHTML='[-]';}else{a.style.display='none';b.innerHTML='[+]';}" style="cursor: pointer;"><span style="padding: 0 5px;">[+]</span>Spoiler</div><div style="padding: 6px; margin: 0; display: none;"><p>я привёл аргументы в защиту своего &quot;исследования&quot; в ответ на ваши, местами не по теме. Это называется &quot;потроллить&quot;?<br />Вы не смогли ничего ответить. А только обиделись и потёрли все свои сообщения.<br />Если не нравится мой пример - приведите свой. Если что-то делаю неправильно - покажите, как правильно.<br />Или вы зашли сюда только сообщить, что моя затея бессмысленна? Так кто кого &quot;троллит&quot;?<br />Аргументы, типа &quot;я много знаю, поэтому прав&quot; не принимаются без доказательств.</p><div class="quotebox"><cite>sam063rus пишет:</cite><blockquote><p>признаться, только сейчас понял, что Вы своими вырываниями фраз из текста - просто меня удачно потроллили.</p></blockquote></div><p>Не сочтите за труд: покажите, где я не прав? Не спора ради, а истины для.</p></div></div>]]></content>
			<author>
				<name><![CDATA[CyberTrader]]></name>
				<uri>https://quik2dde.ru/profile.php?id=248</uri>
			</author>
			<updated>2015-07-27T11:49:07Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=1525#p1525</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Скорость работы Lua vs С++]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=1524#p1524" />
			<content type="html"><![CDATA[<p>-</p>]]></content>
			<author>
				<name><![CDATA[sam063rus]]></name>
				<uri>https://quik2dde.ru/profile.php?id=228</uri>
			</author>
			<updated>2015-07-27T11:30:03Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=1524#p1524</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Скорость работы Lua vs С++]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=1523#p1523" />
			<content type="html"><![CDATA[<p>Изменена функция расчёта SMA: добавлены параметры, по которым рассчитывается значение SMA: Open, High, Low, Close, Median Price, Typical Price, Weighted Close, Volume. Скачать исходники можно по ссылке в первом сообщении.</p><br /><div class="quotebox"><cite>sam063rus пишет:</cite><blockquote><p>Кроме того, файловые операции могут выдавать каждый раз разные тайминги в профайлере</p></blockquote></div><p>Файловые операции занимают ~9-12% от общего процессорного времени, затрачиваемого функцией CreateCandles (чтение данных из файла и заполнение массива). Основное же время тратится на парсинг строк и заполнение массива данных.<br /> Но, если не нравится чтение с диска, можно считывать данные из файла на логическом диске в оперативной памяти. Так нормально будет?</p><br /><p><strong>swerg</strong>,<br />вы всё не правильно поняли. В визуальную таблицу QUIK выводится только ход расчёта индикатора (не более 10% от общей функции расчёта CalcSMA, измерено). Остальное - извлечение данных из массива и математические операции с ними. Но если визуализация смущает - можно убрать.<br />И да, я готов к конструктивному общению. Пример можно переписать вообще без использования QUIK.</p>]]></content>
			<author>
				<name><![CDATA[CyberTrader]]></name>
				<uri>https://quik2dde.ru/profile.php?id=248</uri>
			</author>
			<updated>2015-07-27T11:19:43Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=1523#p1523</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Скорость работы Lua vs С++]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=1522#p1522" />
			<content type="html"><![CDATA[<p>Я понимаю &quot;проблему&quot; так.<br />Если у вас есть большой вычислительный кусок, работа с файлами, работа с сетью - это это можно написать на С++ и это будет быстрее.<br />Если вы на С++ напишете кусок кода, в котором по сути через Lua-интерфейсы идёт работа с терминалом, с интерфейсом терминала - то врятли можно ожидать сколь-нибудь заметного приращения скорости. По сути вы уберёте лишь интерпретацию Lua-кода, что, вообще говоря, в данном случае весьма незначительный объём работы занимает.</p><p>А именно это производится в приведённом вами примере, на сколько я сумел понять: вы заполняете визуальную таблицу. Плюс делаете это из кода отдельного потока main(), что еще несколько замедляет всю эту бедуиз-за синхронизаций.</p><p>Так что врятли что-то тут ускорится из-за переписывания на С++, при этом написать и отладить всё <br />это в С++ кода - достаточно затрато и занудно...</p>]]></content>
			<author>
				<name><![CDATA[swerg]]></name>
				<uri>https://quik2dde.ru/profile.php?id=78</uri>
			</author>
			<updated>2015-07-27T08:41:04Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=1522#p1522</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Скорость работы Lua vs С++]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=1521#p1521" />
			<content type="html"><![CDATA[<p>-</p>]]></content>
			<author>
				<name><![CDATA[sam063rus]]></name>
				<uri>https://quik2dde.ru/profile.php?id=228</uri>
			</author>
			<updated>2015-07-27T07:30:43Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=1521#p1521</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Скорость работы Lua vs С++]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=1520#p1520" />
			<content type="html"><![CDATA[<p>Справедливая критика приветствуется. Но по теме.</p><p><strong>sam063rus</strong>, уберите весь текст, не относящийся к теме, под спойлер<br /></p><div class="spoilerbox" style="padding: 0px;"><div onclick="var e,d,c=this.parentNode,a=c.getElementsByTagName('div')[1],b=this.getElementsByTagName('span')[0];if(a.style.display!=''){while(c.parentNode&&(!d||!e||d==e)){e=d;d=(window.getComputedStyle?getComputedStyle(c, null):c.currentStyle)['backgroundColor'];if(d=='transparent'||d=='rgba(0, 0, 0, 0)')d=e;c=c.parentNode;}a.style.display='';a.style.backgroundColor=d;b.innerHTML='[-]';}else{a.style.display='none';b.innerHTML='[+]';}" style="cursor: pointer;"><span style="padding: 0 5px;">[+]</span>Spoiler</div><div style="padding: 6px; margin: 0; display: none;"><p>Вы так много написали и ничего по существу...<br /></p><div class="quotebox"><cite>sam063rus пишет:</cite><blockquote><p>&quot;Открою&quot; Вам &quot;секрет&quot; - во многих современных проприетарных 3d-движках с поддержкой LUA - вся персонализация игры строится на скриптах. Т.е. &quot;тупо&quot; идёт обращение из лаунчера к функциям движка, отвечающим за скриптинг, далее движок &quot;ныряет&quot; в игровой архив и начинает последовательно исполнять скрипты (несжатые и не байткод-компилированные). Последовательность персонализации игры (то есть того, что делает игру конкретной игрой) задаётся в лаунчере и в скриптах.</p></blockquote></div><p>&quot;Открою&quot; вам &quot;секрет&quot;: то, <strong>как</strong> будут выполняться те или иные действия (анимация), скомпилировано в байт-коде. А последовательность действий (команды) можно хоть в текстовом файлике указать - это не окажет значительного влияния на производительность. Чувствуете разницу?</p><div class="quotebox"><cite>sam063rus пишет:</cite><blockquote><p>пора забыть про &quot;<strong>os.clock</strong>&quot; для измерения скорости/профайлинга и уж тем более делать из этого какие-то выводы. Вам для этого нужны &quot;прямые&quot; функции winapi и, желательно с &quot;вставками&quot; timeBeginPeriod(1).</p></blockquote></div><p>Так возьмите модифицируйте код.<br />Чтобы сравнить, два временных промежутка, значительно отличающихся по величине, суперточность не нужна. (Кстати, таймер, можно уменьшить и без timeBeginPeriod(1).) Главное понимание, что один метод быстрее другого. Или вы можете <strong>привести конкретный пример</strong>, когда, скажем при разнице в 30% os.clock() не даёт такого понимания?<br /></p><div class="quotebox"><cite>sam063rus пишет:</cite><blockquote><p>Кроме того, файловые операции могут выдавать каждый раз разные тайминги в профайлере</p></blockquote></div><p>Меня не столько интересует скорость чтения файла (поскольку данные из файла считываюся однократно), сколько дальнейшая работа с массивом данных. Но для общего понимания добавил таймер.<br /></p><div class="quotebox"><cite>sam063rus пишет:</cite><blockquote><p>С другой стороны, для определённых примеров будет действительно быстрее и переход будет оправдан. <strong>И вот такие примеры действительно стоит обсуждать</strong>.</p></blockquote></div><p>Вы можете предложить свой пример. Я с удовольствием приму участие в обсуждении. А то так прийти и [s]нас[/s] охаять каждый может. <strong>По теме есть что-то?</strong></p></div></div>]]></content>
			<author>
				<name><![CDATA[CyberTrader]]></name>
				<uri>https://quik2dde.ru/profile.php?id=248</uri>
			</author>
			<updated>2015-07-27T06:47:00Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=1520#p1520</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Скорость работы Lua vs С++]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=1519#p1519" />
			<content type="html"><![CDATA[<p>--</p>]]></content>
			<author>
				<name><![CDATA[sam063rus]]></name>
				<uri>https://quik2dde.ru/profile.php?id=228</uri>
			</author>
			<updated>2015-07-27T05:32:42Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=1519#p1519</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Скорость работы Lua vs С++]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=1518#p1518" />
			<content type="html"><![CDATA[<p>--</p>]]></content>
			<author>
				<name><![CDATA[sam063rus]]></name>
				<uri>https://quik2dde.ru/profile.php?id=228</uri>
			</author>
			<updated>2015-07-27T03:32:41Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=1518#p1518</id>
		</entry>
</feed>
