Я тут очередной раз упоролся и подумал а не пробрасывать ли указатели на функции из одной библиотеки в другую через ffi lua, сейчас несколько реализаций одного и того же делаю и удобно so либы в lua просто прописывать готовые и всё. Прикольно короче.
Но тут взял и «побенчил» сишные вызовы из luajit все знают прикол что luajit ffi код порою быстрее просто сишного потому что у них косвенный вызов функций от линковки динамической быстрее чем нативный. Но если вызовы делать выше определённого порога раз то… короче я не понял что произошло? Или я под утро туплю опят жестоко? ::)
libx.c
#include <stdio.h>
const char name[10] = "libx.so";
int libx(int x)
{
return x + x;
}
void * libxptr()
{
return libx;
}
liby.c
#include <stdio.h>
int libyinit(void * x)
{
if(!x) return -1;
int (*libxcall)(int) = x;
return libxcall(42);
}
libz.c
#include <stdint.h>
#include <stdlib.h>
void * libxptr();
int libyinit(void * ptr);
int main(int argc, char *argv[])
{
uint64_t mmax = atoll(getenv("COUNTER"));
for (uint64_t i = 0; i < mmax; ++i)
{
libyinit(libxptr());
}
return 0;
}
connector.lua
ffi = require("ffi")
ffi.cdef
[[
void * libxptr();
int libyinit(void * ptr);
]]
libx = ffi.load("./libx.so")
liby = ffi.load("./liby.so")
mmax = os.getenv("COUNTER")
for i=0,mmax,1 do
liby.libyinit(libx.libxptr())
end
Makefile
SHELL=bash
all:libx liby libz run-1 run-2
libx:
gcc -shared -fPIC libx.c -o libx.so
liby:
gcc -shared -fPIC liby.c -o liby.so
libz:
gcc libz.c -o libz -L./ -lx -ly
run-1:
echo -e "------------- \n 1000000"
time COUNTER=1000000 luajit ./connector.lua
time COUNTER=1000000 LD_LIBRARY_PATH=./ ./libz
run-2:
echo -e "------------- \n 100000000"
time COUNTER=100000000 luajit ./connector.lua
time COUNTER=100000000 LD_LIBRARY_PATH=./ ./libz
clean:
rm libx.so liby.so libz
.SILENT:run-1 run-2
out
dron@gnu:~/Рабочий-Стол/lua-ffi-connector$ make
gcc -shared -fPIC libx.c -o libx.so
gcc -shared -fPIC liby.c -o liby.so
-------------
1000000
real 0m0,016s
user 0m0,012s
sys 0m0,005s
real 0m0,718s
user 0m0,714s
sys 0m0,004s
-------------
100000000
real 0m0,588s
user 0m0,587s
sys 0m0,001s
real 0m0,002s
user 0m0,001s
sys 0m0,001s
dron@gnu:~/Рабочий-Стол/lua-ffi-connector$