83 lines
2.2 KiB
Plaintext
83 lines
2.2 KiB
Plaintext
use std.os;
|
|
use std.dylib;
|
|
use module.libfib;
|
|
|
|
println(keys(libfib));
|
|
libfib.test_ghost();
|
|
|
|
var libfib = func() {
|
|
var (dd, fib, qfib) = (nil, nil, nil);
|
|
var invoke = dylib.limitcall(1);
|
|
return {
|
|
open: func() {
|
|
if (dd==nil) {
|
|
dd = dylib.dlopen("libfib."~(os.platform()=="windows"?"dll":"so"));
|
|
fib = dd.fib;
|
|
qfib = dd.quick_fib;
|
|
} else {
|
|
println("[info ] already loaded.");
|
|
}
|
|
},
|
|
close: func() {
|
|
if (dd==nil) {
|
|
println("[error ] already closed.");
|
|
return;
|
|
}
|
|
dylib.dlclose(dd.lib);
|
|
(dd, fib, qfib) = (nil, nil, nil);
|
|
},
|
|
fib: func(x) {
|
|
if (fib!=nil) {
|
|
return invoke(fib, x);
|
|
}
|
|
println("[error ] cannot call fib.");
|
|
return nil;
|
|
},
|
|
qfib: func(x) {
|
|
if (qfib!=nil) {
|
|
return invoke(qfib, x);
|
|
}
|
|
println("[error ] cannot call qfib.");
|
|
return nil;
|
|
}
|
|
}
|
|
}();
|
|
|
|
println("[keys ] ", keys(libfib));
|
|
libfib.open();
|
|
libfib.open();
|
|
var tm = maketimestamp();
|
|
tm.stamp();
|
|
println("[result] ", libfib.fib(35));
|
|
println("[time ] ", tm.elapsedMSec()," ms");
|
|
tm.stamp();
|
|
println("[result] ", libfib.qfib(35));
|
|
println("[time ] ", tm.elapsedMSec()," ms");
|
|
# libfib.close();
|
|
println("[result] ", libfib.fib(35));
|
|
println("[result] ", libfib.qfib(35));
|
|
# libfib.close();
|
|
|
|
var speed_test = func() {
|
|
var d = dylib.dlopen("libfib."~(os.platform()=="windows"? "dll":"so"));
|
|
println("[dylib ] ", d);
|
|
var fd = d.quick_fib;
|
|
var vec_call = dylib.dlcall;
|
|
var invoke = dylib.limitcall(1);
|
|
var tm = maketimestamp();
|
|
|
|
for(var t=0; t<10; t+=1) {
|
|
tm.stamp();
|
|
for(var i=0; i<5e5; i+=1) {
|
|
invoke(fd, 40);
|
|
}
|
|
println("[time ] limited call: ", int(5e5/tm.elapsedMSec()), " call/ms");
|
|
tm.stamp();
|
|
for(var i=0; i<5e5; i+=1) {
|
|
vec_call(fd, 40);
|
|
}
|
|
println("[time ] dynamic call: ", int(5e5/tm.elapsedMSec()), " call/ms");
|
|
}
|
|
}
|
|
|
|
speed_test(); |