🐛 fix dynamic arguments load bug in nasal_vm
This commit is contained in:
parent
cb547499ac
commit
175706126b
49
nasal_gc.h
49
nasal_gc.h
|
@ -40,26 +40,6 @@ enum vm_type:u8 {
|
||||||
vm_co
|
vm_co
|
||||||
};
|
};
|
||||||
const u32 gc_tsize=vm_co-vm_str+1;
|
const u32 gc_tsize=vm_co-vm_str+1;
|
||||||
// change parameters here to make your own efficient gc
|
|
||||||
// better set bigger number on vm_vec
|
|
||||||
const u32 ini[gc_tsize]={
|
|
||||||
128, // vm_str
|
|
||||||
128, // vm_vec
|
|
||||||
32, // vm_hash
|
|
||||||
128, // vm_func
|
|
||||||
0, // vm_upval
|
|
||||||
0, // vm_obj
|
|
||||||
0 // vm_co
|
|
||||||
};
|
|
||||||
const u32 incr[gc_tsize]={
|
|
||||||
1024,// vm_str
|
|
||||||
512, // vm_vec
|
|
||||||
512, // vm_hash
|
|
||||||
512, // vm_func
|
|
||||||
512, // vm_upval
|
|
||||||
128, // vm_obj
|
|
||||||
128 // vm_co
|
|
||||||
};
|
|
||||||
|
|
||||||
struct nas_vec; // vector
|
struct nas_vec; // vector
|
||||||
struct nas_hash; // hashmap(dict)
|
struct nas_hash; // hashmap(dict)
|
||||||
|
@ -481,6 +461,16 @@ struct gc {
|
||||||
std::vector<nas_val*> memory; // gc memory
|
std::vector<nas_val*> memory; // gc memory
|
||||||
std::vector<nas_val*> unused[gc_tsize]; // gc free list
|
std::vector<nas_val*> unused[gc_tsize]; // gc free list
|
||||||
|
|
||||||
|
u32 incr[gc_tsize]={
|
||||||
|
128, // vm_str
|
||||||
|
128, // vm_vec
|
||||||
|
64, // vm_hash
|
||||||
|
128, // vm_func
|
||||||
|
256, // vm_upval
|
||||||
|
16, // vm_obj
|
||||||
|
16 // vm_co
|
||||||
|
};
|
||||||
|
|
||||||
/* values for analysis */
|
/* values for analysis */
|
||||||
u64 size[gc_tsize];
|
u64 size[gc_tsize];
|
||||||
u64 gcnt[gc_tsize];
|
u64 gcnt[gc_tsize];
|
||||||
|
@ -583,12 +573,16 @@ void gc::sweep() {
|
||||||
|
|
||||||
void gc::extend(u8 type) {
|
void gc::extend(u8 type) {
|
||||||
u8 index=type-vm_str;
|
u8 index=type-vm_str;
|
||||||
++size[index];
|
size[index]+=incr[index];
|
||||||
for(u32 i=0;i<incr[index];++i) {
|
for(u32 i=0;i<incr[index];++i) {
|
||||||
nas_val* tmp=new nas_val(type);
|
nas_val* tmp=new nas_val(type);
|
||||||
|
if (!tmp) {
|
||||||
|
std::exit(-1);
|
||||||
|
}
|
||||||
memory.push_back(tmp);
|
memory.push_back(tmp);
|
||||||
unused[index].push_back(tmp);
|
unused[index].push_back(tmp);
|
||||||
}
|
}
|
||||||
|
incr[index]*=2;
|
||||||
}
|
}
|
||||||
|
|
||||||
void gc::init(const std::vector<string>& s,const std::vector<string>& argv) {
|
void gc::init(const std::vector<string>& s,const std::vector<string>& argv) {
|
||||||
|
@ -599,13 +593,6 @@ void gc::init(const std::vector<string>& s,const std::vector<string>& argv) {
|
||||||
for(u8 i=0;i<gc_tsize;++i) {
|
for(u8 i=0;i<gc_tsize;++i) {
|
||||||
size[i]=gcnt[i]=acnt[i]=0;
|
size[i]=gcnt[i]=acnt[i]=0;
|
||||||
}
|
}
|
||||||
for(u8 i=0;i<gc_tsize;++i) {
|
|
||||||
for(u32 j=0;j<ini[i];++j) {
|
|
||||||
nas_val* tmp=new nas_val(i+vm_str);
|
|
||||||
memory.push_back(tmp);
|
|
||||||
unused[i].push_back(tmp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cort=nullptr;
|
cort=nullptr;
|
||||||
// init constant strings
|
// init constant strings
|
||||||
strs.resize(s.size());
|
strs.resize(s.size());
|
||||||
|
@ -647,16 +634,16 @@ void gc::info() {
|
||||||
maxlen=maxlen<len?len:maxlen;
|
maxlen=maxlen<len?len:maxlen;
|
||||||
len=std::to_string(acnt[i]).length();
|
len=std::to_string(acnt[i]).length();
|
||||||
maxlen=maxlen<len?len:maxlen;
|
maxlen=maxlen<len?len:maxlen;
|
||||||
len=std::to_string(ini[i]+size[i]*incr[i]).length();
|
len=std::to_string(size[i]).length();
|
||||||
maxlen=maxlen<len?len:maxlen;
|
maxlen=maxlen<len?len:maxlen;
|
||||||
}
|
}
|
||||||
double total=0;
|
double total=0;
|
||||||
for(u8 i=0;i<gc_tsize;++i) {
|
for(u8 i=0;i<gc_tsize;++i) {
|
||||||
if (gcnt[i] || acnt[i] || ini[i] || size[i]) {
|
if (gcnt[i] || acnt[i] || size[i]) {
|
||||||
total+=gcnt[i];
|
total+=gcnt[i];
|
||||||
std::clog<<" "<<name[i]<<" | "<<std::left<<std::setw(maxlen)<<std::setfill(' ')<<gcnt[i];
|
std::clog<<" "<<name[i]<<" | "<<std::left<<std::setw(maxlen)<<std::setfill(' ')<<gcnt[i];
|
||||||
std::clog<<" | "<<std::left<<std::setw(maxlen)<<std::setfill(' ')<<acnt[i];
|
std::clog<<" | "<<std::left<<std::setw(maxlen)<<std::setfill(' ')<<acnt[i];
|
||||||
std::clog<<" | "<<std::left<<std::setw(maxlen)<<std::setfill(' ')<<ini[i]+size[i]*incr[i]<<" (+"<<size[i]<<")\n";
|
std::clog<<" | "<<std::left<<std::setw(maxlen)<<std::setfill(' ')<<size[i]<<"\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
double t=worktime*1.0/1000000000; // seconds
|
double t=worktime*1.0/1000000000; // seconds
|
||||||
|
|
|
@ -719,13 +719,18 @@ inline void vm::o_callfv() {
|
||||||
}
|
}
|
||||||
|
|
||||||
var dynamic=nil;
|
var dynamic=nil;
|
||||||
top=local+func.lsize;
|
|
||||||
if (func.dpara>=0) { // load dynamic arguments
|
if (func.dpara>=0) { // load dynamic arguments
|
||||||
dynamic=ngc.alloc(vm_vec);
|
dynamic=ngc.alloc(vm_vec);
|
||||||
for(u32 i=psize;i<argc;++i) {
|
for(u32 i=psize;i<argc;++i) {
|
||||||
dynamic.vec().elems.push_back(local[i]);
|
dynamic.vec().elems.push_back(local[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// should reset stack top after allocating vector
|
||||||
|
// because this may cause gc
|
||||||
|
// then all the available values the vector needs
|
||||||
|
// are all outside the stack top and may be
|
||||||
|
// collected incorrectly
|
||||||
|
top=local+func.lsize;
|
||||||
|
|
||||||
u32 min_size=(std::min)(psize,argc); // avoid error in MSVC
|
u32 min_size=(std::min)(psize,argc); // avoid error in MSVC
|
||||||
for(u32 i=min_size;i>=1;--i) { // load arguments
|
for(u32 i=min_size;i>=1;--i) { // load arguments
|
||||||
|
|
|
@ -1,13 +1,6 @@
|
||||||
import.stl.sort;
|
import.stl.sort;
|
||||||
import.stl.process_bar;
|
import.stl.process_bar;
|
||||||
|
|
||||||
for(var i=0;i<1954;i+=1){
|
|
||||||
runtime.gc.extend("str");
|
|
||||||
}
|
|
||||||
for(var i=0;i<3907;i+=1){
|
|
||||||
runtime.gc.extend("vec");
|
|
||||||
}
|
|
||||||
|
|
||||||
var test=func(n){
|
var test=func(n){
|
||||||
var ts=maketimestamp();
|
var ts=maketimestamp();
|
||||||
var bar=process_bar.high_resolution_bar(40);
|
var bar=process_bar.high_resolution_bar(40);
|
||||||
|
|
|
@ -1,9 +1,5 @@
|
||||||
import.module.libsock;
|
import.module.libsock;
|
||||||
|
|
||||||
for(var i=0;i<60;i+=1){
|
|
||||||
runtime.gc.extend("str");
|
|
||||||
}
|
|
||||||
|
|
||||||
var http=func(){
|
var http=func(){
|
||||||
var sd=nil;
|
var sd=nil;
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -39,14 +39,14 @@ libfib.open();
|
||||||
libfib.open();
|
libfib.open();
|
||||||
var tm=maketimestamp();
|
var tm=maketimestamp();
|
||||||
tm.stamp();
|
tm.stamp();
|
||||||
println("[result] ",libfib.fib(40));
|
println("[result] ",libfib.fib(35));
|
||||||
println("[time ] ",tm.elapsedMSec()," ms");
|
println("[time ] ",tm.elapsedMSec()," ms");
|
||||||
tm.stamp();
|
tm.stamp();
|
||||||
println("[result] ",libfib.qfib(40));
|
println("[result] ",libfib.qfib(35));
|
||||||
println("[time ] ",tm.elapsedMSec()," ms");
|
println("[time ] ",tm.elapsedMSec()," ms");
|
||||||
libfib.close();
|
libfib.close();
|
||||||
println("[result] ",libfib.fib(40));
|
println("[result] ",libfib.fib(35));
|
||||||
println("[result] ",libfib.qfib(40));
|
println("[result] ",libfib.qfib(35));
|
||||||
libfib.close();
|
libfib.close();
|
||||||
|
|
||||||
var speed_test=func(){
|
var speed_test=func(){
|
||||||
|
@ -56,19 +56,22 @@ var speed_test=func(){
|
||||||
var vec_call=dylib.dlcall;
|
var vec_call=dylib.dlcall;
|
||||||
var invoke=dylib.limitcall(1);
|
var invoke=dylib.limitcall(1);
|
||||||
var tm=maketimestamp();
|
var tm=maketimestamp();
|
||||||
var duration=0;
|
|
||||||
|
|
||||||
for(var t=0;t<10;t+=1){
|
for(var t=0;t<10;t+=1){
|
||||||
|
var cnt=0;
|
||||||
tm.stamp();
|
tm.stamp();
|
||||||
for(var i=0;i<5e6;i+=1)
|
while(tm.elapsedMSec()<50){
|
||||||
invoke(fd,40);
|
invoke(fd,35);
|
||||||
duration=tm.elapsedMSec();
|
cnt+=1;
|
||||||
println("[time ] limited call: ",duration," ms avg ",5e6/duration," call/ms");
|
}
|
||||||
|
println("[time ] limited call: ",int(cnt/tm.elapsedMSec())," call/ms");
|
||||||
|
cnt=0;
|
||||||
tm.stamp();
|
tm.stamp();
|
||||||
for(var i=0;i<5e6;i+=1)
|
while(tm.elapsedMSec()<50){
|
||||||
vec_call(fd,40);
|
vec_call(fd,35);
|
||||||
duration=tm.elapsedMSec();
|
cnt+=1;
|
||||||
println("[time ] dynamic call: ",duration," ms avg ",5e6/duration," call/ms");
|
}
|
||||||
|
println("[time ] dynamic call: ",int(cnt/tm.elapsedMSec())," call/ms");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -61,37 +61,39 @@ func(){
|
||||||
var f2=func(){var a=1;return a+1;}
|
var f2=func(){var a=1;return a+1;}
|
||||||
var f3=func(){var (a,b)=(1,1);return a+b+1;}
|
var f3=func(){var (a,b)=(1,1);return a+b+1;}
|
||||||
tm.stamp();
|
tm.stamp();
|
||||||
for(var i=0;i<1e7;i+=1);
|
for(var i=0;i<1e6;i+=1);
|
||||||
duration=tm.elapsedMSec()/1e3;
|
duration=tm.elapsedMSec();
|
||||||
println("total ",duration," sec, ",str(int(1e7/duration/1e6))," M calc/sec");
|
println(str(int(1e6/duration))," calc/ms");
|
||||||
tm.stamp();
|
tm.stamp();
|
||||||
for(var i=0;i<1e7;i+=1)f1();
|
for(var i=0;i<1e6;i+=1)f1();
|
||||||
duration=tm.elapsedMSec()/1e3;
|
duration=tm.elapsedMSec();
|
||||||
println("total ",duration," sec, ",str(int(1e7/duration/1e6))," M calc/sec");
|
println(str(int(1e6/duration))," calc/ms");
|
||||||
tm.stamp();
|
tm.stamp();
|
||||||
for(var i=0;i<1e7;i+=1)func{}();
|
for(var i=0;i<1e6;i+=1)func{}();
|
||||||
duration=tm.elapsedMSec()/1e3;
|
duration=tm.elapsedMSec();
|
||||||
println("total ",duration," sec, ",str(int(1e7/duration/1e6))," M calc/sec");
|
println(str(int(1e6/duration))," calc/ms");
|
||||||
tm.stamp();
|
tm.stamp();
|
||||||
for(var i=0;i<1e7;i+=1)f2();
|
for(var i=0;i<1e6;i+=1)f2();
|
||||||
duration=tm.elapsedMSec()/1e3;
|
duration=tm.elapsedMSec();
|
||||||
println("total ",duration," sec, ",str(int(1e7/duration/1e6))," M calc/sec");
|
println(str(int(1e6/duration))," calc/ms");
|
||||||
for(var i=0;i<1e7;i+=1)
|
tm.stamp();
|
||||||
|
for(var i=0;i<1e6;i+=1)
|
||||||
func{
|
func{
|
||||||
var a=1;
|
var a=1;
|
||||||
return a+1;
|
return a+1;
|
||||||
}();
|
}();
|
||||||
duration=tm.elapsedMSec()/1e3;
|
duration=tm.elapsedMSec();
|
||||||
println("total ",duration," sec, ",str(int(1e7/duration/1e6))," M calc/sec");
|
println(str(int(1e6/duration))," calc/ms");
|
||||||
tm.stamp();
|
tm.stamp();
|
||||||
for(var i=0;i<1e7;i+=1)f3();
|
for(var i=0;i<1e6;i+=1)f3();
|
||||||
duration=tm.elapsedMSec()/1e3;
|
duration=tm.elapsedMSec();
|
||||||
println("total ",duration," sec, ",str(int(1e7/duration/1e6))," M calc/sec");
|
println(str(int(1e6/duration))," calc/ms");
|
||||||
for(var i=0;i<1e7;i+=1)
|
tm.stamp();
|
||||||
|
for(var i=0;i<1e6;i+=1)
|
||||||
func{
|
func{
|
||||||
var (a,b)=(1,1);
|
var (a,b)=(1,1);
|
||||||
return a+b+1;
|
return a+b+1;
|
||||||
}();
|
}();
|
||||||
duration=tm.elapsedMSec()/1e3;
|
duration=tm.elapsedMSec();
|
||||||
println("total ",duration," sec, ",str(int(1e7/duration/1e6))," M calc/sec");
|
println(str(int(1e6/duration))," calc/ms");
|
||||||
}();
|
}();
|
Loading…
Reference in New Issue