Всем известно, что есть библиотека ffi
Библиотека FFI позволяет вызывать внешние функции C и использовать структуры данных C из чистого кода Lua.
Библиотека FFI в значительной степени устраняет необходимость написания утомительных ручных привязок Lua / C на C.
Нет необходимости изучать отдельный язык привязки — он анализирует простые объявления C!
Они могут быть вырезаны и вставлены из заголовочных файлов C или справочных руководств.
Это задача связывания больших библиотек без необходимости иметь дело с хрупкими генераторами привязки.
---------------------
Все казалось прекрасно, но...
Библиотека FFI тесно интегрирована в LuaJIT (она недоступна как отдельный модуль).
конечно, не так уж страшно, но...
LuaJIT сделан на ядре Lua5.1 и следовательно для квика не подходит.
------------------------
Написал собственную библиотеку для любого ядра Lua, которая делает тоже самое, что и FFI, но быстрее.
В итоге можно загрузить на исполнение любую функцию написанную на С/С++ из любой библиотеки DLL.
И следовательно получить максимальную скорость вычисления любых алгоритмов, не программируя на СИ и не изучая API C for Lua.
----------------------------
Накладные расходы на преобразование параметров в пределах кванта высокоточного таймера (см далее).
---------------------------
Вот пример вызова трех функций из WIN32
------------------------------
QueryPerformanceCounter - высокоточный таймер квант 0.1 мкс.
SleepEx - функция паузы
MessageBoxA - вывод окна сообщения
пример вызова в луа:
В программе два варианта измерение интервала Sleep в 1 секунду
и вывод результата в окно
Код |
---|
-------------sleep и высокоточный таймер вариант 1 ------------------- local x1=rfs("i","QueryPerformanceCounter","Kernel32.dll"); rfs(0,"SleepEx","Kernel32.dll",1000,0); local x2=rfs("i","QueryPerformanceCounter","Kernel32.dll"); -------------sleep и высокоточный таймер вариант 2 ------------------- local pL,pF=nkcf.gf2L("Kernel32.dll","QueryPerformanceCounter") local x3=rfs("i",pF); rfs(0,"SleepEx","Kernel32.dll",1000,0); local x4=rfs("i",pF); s="t1="..0.1*(x2-x1).." мкс".." t2="..0.1*(x4-x3).." мкс"; print(" "..s); rfs(0,"MessageBoxA","User32.dll",0, s, "sleep, timer",1); |