Я тут очередной раз упоролся и подумал а не пробрасывать ли указатели на функции из одной библиотеки в другую через 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$









 , , , ,






URL записи