Let_it_go (Все сообщения пользователя)

Выбрать дату в календареВыбрать дату в календаре

Страницы: Пред. 1 2 3 4 5 6 7 8 След.
профилирование кода Lua+dll
 
Сижу туплю, не пойму как мне профилировать dll на Си++ с помощью Visual Studio 2017.
dll вызывается из Луа

Что писать в Command-line arguments и Working directory?
При попытке запустить профилирование появляется ошибка:

Это сопровождается текстом:
Profiling started.
Instrumenting D:\_c++\runfast\Release\runfast.dll in place
Info VSP3049: Small functions will be excluded from instrumentation.
Microsoft ® VSInstr Post-Link Instrumentation 15.8.18219.1 x86
Unable to obtain debug information. Link with the /PROFILE linker switch.
PRF0002: Instrumentation failed with these options: /u "D:\_c++\runfast\Release\runfast.dll"   /excludesmallfuncs.  Please check the output window for additional details.
Data written to D:\_c++\runfast\info181001(3).vsp.
Profiling finished.
Profiling complete.

Английские слова все понятны, но технический смысл я не улавливаю.
Помогите пожалуйста
проблема LuaRocks
 
Цитата
2) поместить все искомые модули в папки /lua (*.lua) и /Include (*.dll -- ещё можно в корень Quik'а кидать их, а для некоторых .dll не можно, а нужно) в дистрибутиве Quik.
а я имею право это делать для модулей устанавливаемых с помощью LuaRocks?
Там какой-то сложный процесс идёт при установке.
Неужели просто можно взять и перекопировать в /lua?
Выглядят эти модули странно:

--
И вытекающий вопрос. я не хочу ставить на виртуалку VisualStudio, чтобы вызывать Developer Command Prompt. Я могу установить пакет на ноутбук (на ноутбуке визуал студия стоит), а потом перекопировать на виртуалку установленный пакет?
проблема LuaRocks
 
Получилось в таком виде.
Код
package.path=package.path..';C:\\Program Files (x86)\\Lua\\5.1\\rocks;'
работает.
---
но если подскажете про LDIR буду благодарен
проблема LuaRocks
 
LDIR нашёл в папке luaconf.h, но я не понимаю что мне с этим делать.
Код
** In Windows, any exclamation mark ('!') in the path is replaced by the
** path of the directory of the executable file of the current process.
*/
#define LUA_LDIR   "!\\lua\\"
#define LUA_CDIR   "!\\"
#define LUA_PATH_DEFAULT  \
      ".\\?.lua;"  LUA_LDIR"?.lua;"  LUA_LDIR"?\\init.lua;" \
                   LUA_CDIR"?.lua;"  LUA_CDIR"?\\init.lua"
#define LUA_CPATH_DEFAULT \
   ".\\?.dll;"  ".\\?51.dll;"  LUA_CDIR"?.dll;" LUA_CDIR"?51.dll;" LUA_CDIR"clibs\\?.dll;" LUA_CDIR"clibs\\?51.dll;" LUA_CDIR"loadall.dll;" LUA_CDIR"clibs\\loadall.dll"

#else
#define LUA_ROOT   "/usr/local/"
#define LUA_LDIR   LUA_ROOT "share/lua/5.1/"
#define LUA_CDIR   LUA_ROOT "lib/lua/5.1/"
#define LUA_PATH_DEFAULT  \
      "./?.lua;"  LUA_LDIR"?.lua;"  LUA_LDIR"?/init.lua;" \
                  LUA_CDIR"?.lua;"  LUA_CDIR"?/init.lua"
#define LUA_CPATH_DEFAULT \
   "./?.so;"  "./lib?51.so;"  LUA_CDIR"?.so;" LUA_CDIR"lib?51.so;" LUA_CDIR"loadall.so"
#endif

Обсуждаемый здесь модуль chronos поставился сюда:
проблема LuaRocks
 
Второй вопрос. LuaRocks позиционируется как удобная штука, чтобы модули можно было вызывать с помощью require
Пишу require "chronos"
и он его не находит :(



справедливости ради надо сказать, что ни в одной из этих папок действительно нет этого модуля.
Как же мне его подключить?
проблема LuaRocks
 
Спасибо. Получилось.
Я нашёл такой же совет как ваш, но ошибочно думал что речь про это:

это Command Window в Visual Studio
проблема LuaRocks
 
Впервые пользуюсь установкой луа пакетов с помощью LuaRocks
пробовал установить два пакета-безрезультатно.
Выскакивает такая ошибка:


Сама luarocks работает. Команды выполняет:
Lua сервер для передачи данных из Quik через сокеты., Данные передаются в формате json
 
Уточните пожалуйста, на данный момент есть многопоточность или всё же она отключена?
% lua hello.lua
 
Цитата
s_mike@rambler.ru написал:
c:\dir > lua.exe hello.lua
не выполняет.
попробовал три варианта
% lua hello.lua
 
Цитата
% - это линукс оболочка, bash н-р
спасибо
автор книги мог бы уточнить этот важный нюанс
% lua hello.lua
 
Хочу систематизировать знания по Луа, читаю книгу Иерузалмиски
Сразу какие-то непонятки:


у меня возникает такая проблема. Почему?


файл лежит в корне луа там где lua.exe
dofile в защищённом режиме
 
Цитата
s_mike@rambler.ru написал:
Ну да, типа такого. Можно ещё посмотреть на возвращаемое значение pcall
хм... а как мне в функцию foo передать параметр?
Код
function main()
   while is_run do
   pcall(foo("privet"))
   mm(t)--печать в виде message таблицы из файла.
   sleep(1000)
   end
end

function foo(slovo)
   a=slovo
   dofile ("C:\\1.lua")--здесь сидит таблица t
end
выдаёт ошибку bad argument #1 to 'pcall' (value expected)
dofile в защищённом режиме
 
Цитата
s_mike@rambler.ru написал:
Вам поможет pcall или xpcall
ооо, спасибо!
который раз уже спасаете :)
Вроде бы получилось, и не выбивает если в файле написать кривулины
Вы это имели в виду или можно понадёжнее сделать?
Код
function main()
   while is_run do
   pcall(foo)
   mm(t)--печать в виде message таблицы из файла.
   sleep(1000)
   end
end

function foo()
   dofile ("C:\\1.lua")--здесь сидит таблица t
end
dofile в защищённом режиме
 
В файле tbl.lua лежит небольшая таблица вида:
Код
t={
a=100
b=200
}

Но иногда в этом файле могут быть кривые данные. Если вызывать этот файл с помощью dofile (tbl.lua), могут быть ошибки и основной скрипт остановится с ошибкой.
Как написать в духе:

dofile (tbl.lua), но если там нечитаемый бред, то идти дальше и не обновлять таблицу t (пользоваться старой).
Глобальные таблицы Lua на C++
 
Цитата
Вы удивитесь, но с большой вероятностью у вас обработка таблиц будет медленнее, чем в луа.
Причина тому в индексе У вас - стринг, а в луа хеш.
Как тогда быть? Может быть использовать другой контейнер?
Глобальные таблицы Lua на C++
 
На stackoverflow ответили:
Надо использовать map
Код
#include <iostream>#include <map>
#include <string>

int main ()
{
  std::map<std::string, int> period_muvinga;

  period_muvinga["GAZP"] = 23;
  period_muvinga["SBER"] = 19;
  period_muvinga["GMKN"] = 20;

  //  Iterate over all the key,value pairs in map
  //
  for (const auto & p: period_muvinga)
    {
      // Extract key from pair
      std::string ticker = p.first;

      // Extract value from pair
      int period = p.second;

      std::cout << ticker << " = " << period << std::endl;
    }
  return 0;
}

Для других целей - более сложных - мне остаётся не понятным в какой части dll объявлять этот массив.
Замысел вкратце.
Объявить массив map с названием average_bid. Вопрос где это делать?
Ключи массива - тикеры акций. объявляются вместе с массивом.
Значения массива - векторы, накапливающие биды за 100 колбеков OnQuote. Это я умею. Цель - посчитать среднее арифметическое бидов за 100 приходов колбека.
---
Использовать OnInit пока не хочу, потому что у меня в нём и так уже в Луа 50 строчек кода, объявляющих таблицы и переменные.
Глобальные таблицы Lua на C++
 
Антон, с этим я уже разобрался, и в первую очередь благодаря Вам ;)
Но я имел в виду другое. Уже внутри кода dll мне придётся работать с тем, что в Луа мне знакомо как таблицы.
У меня 55 инструментов.
Я хочу посчитать по ним средний бид за 100 итераций (за 100 колебаний стакана).
Принимать этот бид в dll я уже могу. Но теперь мне надо где-то накапливать данные по каждой бумаге.
В Луа я бы это делал в таблицах типа:
average_bid[sec]
А в Си++ где их хранить?
Глобальные таблицы Lua на C++
 
Прошу подсказать какой аналог глобальной таблицы Луа для Си++
Совсем точноЙ формулировкой вопроса будет, как то же самое написать на Си++
Код
ticker_list="GAZP,SBER,GMKN"
period_muvinga={}
period_muvinga.GAZP=23
period_muvinga.SBER=19
period_muvinga.GMKN=20
for sec in string.gmatch(ticker_list,"%a+") do
   local period=period_muvinga[sec]
end
и второй вопрос.
Когда дойдёт дело до объявления чего-то глобального в Си++ (то что является ответом на первый вопрос), в какой части кода это объявлять?
Я пока не могу придумать ничего лучше кроме как здесь. Речь идёт про dll, написанную на Си++:
Код
// стандартная точка входа для DLL
BOOL APIENTRY DllMain(HANDLE hModule,
   DWORD  ul_reason_for_call,
   LPVOID lpReserved
)
{
        //ОБЪЯВЛЕНИЕ ГЛОБАЛЬНЫХ ПЕРЕМЕННЫХ
   return TRUE;
}
lua_rawgeti прерывает цикл
 
Разобрался
В конце не хватало два раза remove
Код
lua_remove(L, -1);
lua_remove(L, -1);
lua_rawgeti прерывает цикл
 
Тестирую dll, привязанную к Луа.
Происходит загадочная вещь, прошу помочь.
Привожу код внутри dll
Этот цикл работает правильно.
Код
for (int i = 1; i<=4; i++){            
printf("%i", i);
printf("\n");   
//lua_rawgeti(L, -2, i); закомментировано   
//lua_getfield(L, -1, "quantity"); закомментировано
//auto q = lua_tonumber(L, -1); закомментировано
}
Пишет в консоль
1
2
3
4
Код
А этот цикл обрывается на второй итерации:
for (int i = 1; i<=4; i++){            
printf("%i", i);
printf("\n");   
lua_rawgeti(L, -2, i); 
lua_getfield(L, -1, "quantity"); 
auto q = lua_tonumber(L, -1); 
}
Пишет
1
2

Путём опытов я понял, что проблема в функции lua_rawgeti(L, -2, i);  Она обрывает цикл на второй итерации.
Почему?
П.С. Если это важно, то всё это происходит внутри обработки колбека OnQuote
Передать getQuoteLevel2 в dll
 
Код компилируется без ошибок, формируется dll-файл, но в error list остались ошибки.


Последние две указывают на строчку 49:



Полный текст кода сейчас такой:
Код
#include "stdafx.h"
#define LUA_LIB
#define LUA_BUILD_AS_DLL
extern "C" {
#include "lauxlib.h"
#include "lua.h"
#include "lauxlib.h"
}
// стандартная точка входа для DLL
BOOL APIENTRY DllMain(HANDLE hModule,
   DWORD  ul_reason_for_call,
   LPVOID lpReserved
)
{
   return TRUE;
}
static int getQuote3(lua_State* L) {
   // t = getQuoteLevel2(c_code, s_code)
   lua_getglobal(L, "getQuoteLevel2"); //поместить на стек функцию 
   lua_pushstring(L, "SPBFUT"); //дальше идут параметры
   lua_pushstring(L, "RIU8");
   int num_args = 2, num_ret = 1;
   lua_pcall(L, num_args, num_ret, 0); //вызываем функцию, на стеке окажется таблица   
   lua_getfield(L, -1, "bid_count"); //из таблицы по индексу -1 взять значение ключа "bid_count" и поместить на стек
   int bid_count = lua_tointeger(L, -1);
   if (bid_count < 3) {
      return 0;
   }
   //на стеке -2 = t(table), -1 = bid_count(int)
   lua_getfield(L, -2, "bid"); //на стек положит таблицу со значениями стакана(bid)
   //на стеке -3 = t(table), -2 = bid_count(int), -1 = bid(table)
   lua_rawgeti(L, -1, 3); //из таблицы по индексу -1 взять значение ключа [3] и поместить на стек(еще 1 таблица=bid3)
   //на стеке -4 = t(table), -3 = bid_count(int), -2 = bid(table), -1 = bid3(table)
   //ну и из последней таблицы получаем необходимы значения
   lua_getfield(L, -1, "price");
   lua_getfield(L, -2, "quantity");
   const char * quantity = lua_tostring(L, -1);
   const char * price = lua_tostring(L, -2);
   //на стеке -6 = t(table), -5 = bid_count(int), -4 = bid(table), -3 = bid3(table), -2 = price(string), -1 = quantity(string)
   lua_pop(L, 6); //чистим стек
   return 0;
}

static const struct luaL_Reg mylib[] = {
{"l_getQuote3", getQuote3},
{NULL, NULL} /* sentinel */
};

extern "C" LUALIB_API int luaopen_Stakan(lua_State *L) {
   luaL_openlib(L, "Stakan", mylib, 0);
   return 0;
}
Передать getQuoteLevel2 в dll
 
Антон, ура, скомпилировалось!
Я даже нашёл у вас опечатку
Код
lua_pop(L,6); //чистим стек (забыли букву L)
Но работать пока не работает.


Помогите пожалуйста написать финальные штуки (на них выскакивают ошибки) и.... вы сделали мой день :)
Код
static const struct luaL_Reg Stakan[] = {
{"getQuote3", getQuote3},
{NULL, NULL} /* sentinel */
};

extern "C" LUALIB_API int luaopen_Stakan(lua_State *L) {
   luaL_openlib(L, "Stakan", Stakan, 0);
   return 0;
}
Я не понимаю что писать в аргументы внутри круглых и фигурных скобок.
Компилятор пишет:



Шапка вверху у меня такая:
Код
#include "stdafx.h"
#define LUA_LIB
#define LUA_BUILD_AS_DLL
extern "C" {
#include "lauxlib.h"
#include "lua.h"
#include "lauxlib.h"
}
// стандартная точка входа для DLL
BOOL APIENTRY DllMain(HANDLE hModule,
   DWORD  ul_reason_for_call,
   LPVOID lpReserved
)
{
   return TRUE;
}
Передать getQuoteLevel2 в dll
 
Антон,
спасибо!!!
К тому моменту как увидел ваш ответ, уже накорябал свой вариант, но по прежнему не знал как читать вложенные таблицы (стакан и его поля).
Код
static int forLua_OnQuoteC(lua_State* L) {
   lua_pushnil(L);
   int s = 0;
   while (lua_next(L, -2))
   {
      s = s + 1;
      const char* key = lua_tostring(L, -2);
      double val = lua_tonumber(L, -1);
      lua_pop(L, 1);
   }
   return 1;
}
luaL_len отсутствует в Lua 5.1
 
Подскажите пожалуйста как мне отдельные функции Луа 5.3 внедрять в текущую версию 5.1.
Например, luaL_len(L, 1)
Передать getQuoteLevel2 в dll
 
и ещё вопрос. Я понял суть врапперов, естественно с ними проще.
но всё же, как решить мою задачу без них?
принять таблицу-стакан из OnQuote внутри dll? я сейчас читаю книгу по Луа, написанную её разработчиком. Иду шаг за шагом по главе "C API". В голове каша, но первые проблески уже есть. Строки и числа я уже спокойно обрабатываю в dll.
Передать getQuoteLevel2 в dll
 
Антон,
спасибо.
1. Проект создавать как и раньше в виде dll?
2. Код который вы написали, одинаковый для обоих врапперов?
Передать getQuoteLevel2 в dll
 
Может быть и проще, но я ничего про это не знаю.
Расскажите пожалуйста общий смысл.
Передать getQuoteLevel2 в dll
 
Спасибо этому форуму за советы и подсказки.
Как принять в dll таблицу с целочисленными ключами, разобрался.
Прошу подсказать как внутри dll разобрать по полям более сложную таблицу.
Код
qt=getQuoteLevel2(class, sec)
Согласно документации она возвращает таблицу, в которой два стринга и две вложенных таблицы.

Мне нужны для работы все четыре.
Как мне, к примеру, получить объём из 3-й котировки на покупку?

Для разбора таблицы с целочисленными индексами мой код внутри dll выглядит так:
Код
static int forLua_SumArray(lua_State* L) {
   // Get the length of the table (same as # operator in Lua)
   int n = lua_objlen(L, 1);
   double sum = 0.0;

   // For each index from 1 to n, get the table value as a number and add to sum
   for (int i = 1; i <= n; ++i) {
      lua_rawgeti(L, 1, i);
      sum += lua_tonumber(L, -1);
      lua_pop(L, 1);
   }

   lua_pushnumber(L, sum);
   return 1;
}
Стек при 2 функциях (dll)
 
Michael Bulychev,
тогда мне совсем ничего не понятно. Почему тогда Иерусалимскис пишет в своей книге по Луа:

то есть стек локальный. Зачем тогда lua_newthread()?
dll против Луа. Странности
 
Алексей Ч,
в предложенном вами варианте Луа равна по скорости dll на Си
Код
function sum_new(t)--функция Алексея Ч.
    local sum = 0
    for x=1, #t do
        sum = sum + t[x]
    end
    return sum
end
iterations=1000000
function main ()
   t={}
   for i=1,20 do
      table.insert(t,i)
   end
   start=os.clock()
   for i=1,iterations do
      s=runfast.SumArray(t)--функция из dll
   end
   finish_dll=os.clock()-start
   mm("dll:"..finish_dll)
   start=os.clock()
   for i=1,iterations do
      s=sum(t)--старая функция на Луа с for... pairs
   end
   finish_lua=os.clock()-start
   mm("Lua:"..finish_lua)   
   
   start=os.clock()
   for i=1,iterations do
      s=sum_new(t)--новая функция без pairs
   end
   finish_lua_new=os.clock()-start   
   mm("Lua new:"..finish_lua_new)
   mm("Lua old slower:"..math_round((finish_lua/finish_dll),1))
   mm("Lua new slower:"..math_round((finish_lua_new/finish_dll),1))   
end

dll против Луа. Странности
 
Алексей Ч,
спасибо. Я не знал, что предложенный вами вариант будет быстрее. Обязательно начну использовать.
---
Но ваш комментарий о другом. Я про другое спросил. Почему dll не даёт преимущества в скорости на больших таблицах? Почему при обсчёте таблицы с 20 полями и таблицы с 40 полями разница в производительности одинаковая?  
dll против Луа. Странности
 
На всякий случай код функции sum, которая считает сумму элементов на Луа:
Код
function sum(t)
    local sum = 0
    for k,v in pairs(t) do
        sum = sum + v
    end
    return sum
end
dll против Луа. Странности
 
Вот функция на Си++ внутри dll. Она принимает таблицу и выдаёт обратно в Луа сумму элементов этой таблицы.
Код
static int forLua_SumArray(lua_State* L) {
   // Get the length of the table (same as # operator in Lua)
   int n = lua_objlen(L, 1);
   double sum = 0.0;
   // For each index from 1 to n, get the table value as a number and add to sum
   for (int i = 1; i <= n; ++i) {
      lua_rawgeti(L, 1, i);
      sum += lua_tonumber(L, -1);
      lua_pop(L, 1);
   }

   lua_pushnumber(L, sum);
   return 1;
}
Я ожидаю, что чем больше элементов будет в таблице, тем сильнее dll должна опережать аналогичные подсчёты в Луа.
Написал код для сравнения скорости.
Код
iterations=1000000
function main ()
   t={}
   for i=1,20 do--вставляем в таблицу 20 элементов
      table.insert(t,i)
   end
--гоняем цикл миллион раз
   start=os.clock()
   for i=1,iterations do
      s=runfast.SumArray(t)
   end
   finish_dll=os.clock()-start
   mm("dll:"..finish_dll)
--гоняем цикл миллион раз
   start=os.clock()
   for i=1,iterations do
      s=sum(t)
   end
   finish_lua=os.clock()-start
   mm("Lua:"..finish_lua)
   mm("Lua slower:"..math_round((finish_lua/finish_dll),1))
end

Луа медленнее в 2,4 раза. Я мучаюсь с Си ради роста скорости в 100 раз, ну да ладно. В 2,5 раза тоже кое-что. Сказываются транспортные издержки при перекидывании данных между Си и Луа.
************************
А теперь удивительное для меня. Заполняю таблицу 40 элементами.
Код
        t={}
   for i=1,40 do
      table.insert(t,i)
   end
Значит внутри Си++ будет производиться в 2 раза больше операций и она сможет лучше проявить своё преимущество в скорости по сравнению с Луа.
Но нет: при 40 элементах в таблице преимущество Си в скорости такое же.



Почему?
Я думал, что чем больше таблица, тем быстрее будет работать вариант кода с dll.
Объясните пожалуйста.
Поместить колбек в dll
 
Николай Камынин,
Цитата
вообще-то это прикольно.
Вы написали пример из разряда "как не надо писать программы"
В вашем примере операция сложения занимает промерно 1% всего времени
мы этот пример обсуждали здесь.
https://forum.quik.ru/forum10/topic3896/

Enfernuz написал, что дело в том, как Lua внедрена в КВИК. LuaJIT это сделал бы намного быстрее
Поместить колбек в dll
 
Николай Камынин,
Цитата
в си вместо сложения использовать сдвиг
что это значит?
luaL_len отсутствует в Lua 5.1
 
Спасибо, Антон.
господа разработчики, обновите пожалуйста Луа в Квике до свежей версии
luaL_len отсутствует в Lua 5.1
 
Пытаюсь в моей dll применить код на Си
Код
static int forLua_SumArray (lua_State* L) {    // Get the length of the table (same as # operator in Lua)
    int n = luaL_len(L, 1);
    double sum = 0.0;

    // For each index from 1 to n, get the table value as a number and add to sum
    for (int i = 1; i <= n; ++i) {
      lua_rawgeti(L, 1, i);
      sum += lua_tonumber(L, -1);
      lua_pop(L, 1);
    }

    lua_pushnumber(L, sum);
    return 1; 
}
всё хорошо, но в Луа 5.1. нет функции luaL_len. Она появилась в более поздних версиях.
Вот код этой функции в Луа 5.3.




Как мне это внедрить в свою dll?
Как дописать строку в lauxlib.h - это понятно.  А вот файла lauxlib.c в моей Луа 5.1.5 вообще нет.
Арифметические операции со временем
 
Алексей Ч,
спасибо.
я нашёл функцию, которая это делают
Код
function time_to_number(t)    return (math.floor(t / 10000) * 60 * 60) + ((math.floor(t / 100) % 100) * 60) + (t % 100)
    -- you can also use % 10000 if the hours are limited to two digits
end
А если надо подобное число конвертировать обратно, то есть другая функция.
Код
function time_split(t)    
    local hour = math.floor(t / 3600)
    local min = math.floor((t % 3600) / 60)
    local sec = (t % 3600) % 60
    return hour, min, sec  
end
Арифметические операции со временем
 
Ответы не понятны. При чём здесь 1970 год?
Я вытягиваю из текущей таблицы время последнего изменения через tonumber(getParamEx("SPBFUT",tech_instr,"CHANGETIME").param_value)
оно имеет вид 101200
Добавлять секунды мне нужно к этому числу.
Стек при 2 функциях (dll)
 
Уточнение. Функции длл-библиотеки могут вызываться из разных потоков квика, то есть есть риск одновременной работы с ними, а значит и со стеком
Стек при 2 функциях (dll)
 
У меня в dll две функции. Обе постоянно что то делают со стеком. Есть ли риски того, что они будут по ошибке брать элементы друг друга? Или для каждой из них свой стек и путаница не грозит?
Поместить колбек в dll
 
И ещё вопрос.
В луа скрипте что то писать или достаточно require "runfast" (библиотека dll) чтобы OnQuote начал срабатывать?
Поместить колбек в dll
 
Спасибо, сегодня займусь!
Код
static int onQuote(lua_State *L) {

вроде бы тут надо писать с приставкой forLua:
Код
static int forLua_onQuote(lua_State *L) {
.......

И ещё.
У меня extern C встречается два раза. В какое место ставить ваш код?



Поместить колбек в dll
 
Цитата
Алексей написал:
OnQuote()
   runfast.OnQuote()
end
Спасибо за ответ, но этот вариант не подходит. При каждом срабатывании колбека скрипт будет обращаться к dll. Луа в КВИК встроена настолько кривобоко, что это получается долго.
Луа:
Код
   for i=1,10000000 do     
          r = i+i
   end
Луа+dll на Си++
Код
   for i=1,iterations do
      r = runfast.AddTwoNumbers(i, i)   
  end
Второй код работает в 3,6 раза медленнее, чем первый из-за постоянного перекидывания данных из Луа в Си.
Ваш вариант предусматривает те же самые задержки.

Мне нужно колбек OnQuote полностью упаковать внутрь dll. Вызвать его один раз, и потом он крутится только внутри dll
Поместить колбек в dll
 
Как делать простые вещи с dll вроде разобрался.
Прошу проконсультировать, как поместить в dll колбек OnQuote
Чтобы это выглядело как то так:
package.cpath = "C:\\runfast.dll"
require "runfast"
runfast.OnQuote()
...
и так далее.
Ума не приложу где мне эту строчку runfast.OnQuote()  размещать. За пределами main как и сейчас?
подскажите пожалуйста
Арифметические операции со временем
 
Цитата
Nikolay Pavlov написал:
Добрый день.
Уточните, Вы всегда хотите прибавлять/отнимать секунды?
Все мои арифметические операции с секундами. Это главная потребность. Минуты и часы не нужны
Арифметические операции со временем
 
Я совершаю в Луа арифметические операции со временем. Например 124500+5=124505 (12:45:05).
По какой формуле я могу избежать проблемы с 60 минутами/секундами?
124459+5=124504 (не 124464)
Как этого добиться?
Lua и dll на C
 
Enfernuz,
уже уткнулся. Всё это происходит, потому что мои колбеки OnQuote захлёбываются.
Я принимаю 55 инструментов, и скрипт на луа не справляется.
В каждом колбеке есть логика и математика, которую нельзя переместить в main.
поэтому нужна скорость
Lua и dll на C
 
Enfernuz,
то есть мне для достижения максимальной скорости нужно в dll запихать всё, что сейчас находится в Луа-скрипте. Это позволит обратиться к dll единожды при вызове библиотеки. Вся логика робота будет в dll.
А если переносить в dll только часть функций, то Луа по скорости победит C++, потому что долгое взаимодействие Луа с dll...
Lua и dll на C
 
Написал функцию так, чтобы цикл крутился внутри dll:
Код
static int forLua_AddCircle(lua_State *L) {
   double d1 = luaL_checknumber(L, 1); //с чего начинать цикл
   double d2 = luaL_checknumber(L, 2); //количество итераций
   double r;
   double i;
   for (i = d1; i <= d2; i++)
   {
      r = i + i;
   }
   return(1);
}

Код
package.cpath = "C:\\runfast.dll"
require("runfast")
iterations=100000000
function main()
   start=os.clock()
   for i=1,iterations do
      r = runfast.AddTwoNumbers(i, i)
   end
   finish=os.clock()-start
   message ("C dll:"..tostring(finish), 1)
   start=os.clock()
   for i=1,iterations do
      r = i+i
   end
   finish=os.clock()-start
   message ("Lua:"..tostring(finish), 1)

   start=os.clock()
   r = runfast.AddCircle(1,iterations)
   finish=os.clock()-start
   message ("C dll circle:"..tostring(finish), 1)   
end
Результат:


dll с циклом всех победила.
Страницы: Пред. 1 2 3 4 5 6 7 8 След.
Наверх