LINUX.ORG.RU

Почему такой разброс?

 , , ,


0

2

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

Последнее исправление: LINUX-ORG-RU (всего исправлений: 2)

То есть почему вызов нативной сишной программы 100 миллионов раз на порядок быстрее просто миллиона?

Без понятия :)

Сейчас у себя проверить не могу, но похоже, что 100 миллионов почему-то просто не отрабатывают.

anonymous
()

У меня не воспроизвелось. Все без приколов, вот такой результат

$ make
gcc -shared -fPIC libx.c -o libx.so 
gcc -shared -fPIC liby.c -o liby.so 
------------- 
  1000000

real	0m0.005s
user	0m0.005s
sys	0m0.000s

real	0m0.005s
user	0m0.005s
sys	0m0.000s
------------- 
 100000000

real	0m0.401s
user	0m0.401s
sys	0m0.000s

real	0m0.501s
user	0m0.501s
sys	0m0.000s
praseodim ★★★★★
()
Последнее исправление: praseodim (всего исправлений: 2)
Ответ на: комментарий от praseodim

хм, я даже printf вкорячил и с -00 собрал вывод в /dev/null послал и один пень похожая картинка. Мой phenom 2 валшебный! :D Ой ладно попозже разберусь, ток проснулся =)

LINUX-ORG-RU ★★★★★
() автор топика
Ответ на: комментарий от LamerOk

Они там 54-битные семантически. 100млн должно влезать, другое дело, что у него вообще ни одно время не бьётся с теорией.

anonymous
()
Ответ на: комментарий от LINUX-ORG-RU

nonefor.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")
time COUNTER=1000000 luajit  ./nonefor.lua
anonymous
()
Ответ на: комментарий от hobbit

:D 🍄🍄🍄

🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄
🍄                                         🍄
🍄             🌼              🌼           🍄
🍄                🌼  🌼  🌼                🍄
🍄                 🌼 🍄 🌼                 🍄                                      
🍄                🌼  🌼  🌼                🍄
🍄             🌼             🌼            🍄
🍄                                         🍄
🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄
LINUX-ORG-RU ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.