From 175706126b6e8b1b0f5a10fa846d09c4335b6ddd Mon Sep 17 00:00:00 2001 From: ValKmjolnir Date: Fri, 9 Dec 2022 00:56:53 +0800 Subject: [PATCH] :bug: fix dynamic arguments load bug in nasal_vm --- nasal_gc.h | 49 ++++++++++++++++---------------------------- nasal_vm.h | 7 ++++++- test/datalog.nas | 7 ------- test/httptest.nas | 4 ---- test/module_test.nas | 29 ++++++++++++++------------ test/nasal_test.nas | 44 ++++++++++++++++++++------------------- 6 files changed, 63 insertions(+), 77 deletions(-) diff --git a/nasal_gc.h b/nasal_gc.h index 5a1aa6f..d36d8b7 100644 --- a/nasal_gc.h +++ b/nasal_gc.h @@ -40,26 +40,6 @@ enum vm_type:u8 { vm_co }; 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_hash; // hashmap(dict) @@ -481,6 +461,16 @@ struct gc { std::vector memory; // gc memory std::vector 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 */ u64 size[gc_tsize]; u64 gcnt[gc_tsize]; @@ -583,12 +573,16 @@ void gc::sweep() { void gc::extend(u8 type) { u8 index=type-vm_str; - ++size[index]; + size[index]+=incr[index]; for(u32 i=0;i& s,const std::vector& argv) { @@ -599,13 +593,6 @@ void gc::init(const std::vector& s,const std::vector& argv) { for(u8 i=0;i=0) { // load dynamic arguments dynamic=ngc.alloc(vm_vec); for(u32 i=psize;i=1;--i) { // load arguments diff --git a/test/datalog.nas b/test/datalog.nas index e5d564f..2c4f7e8 100644 --- a/test/datalog.nas +++ b/test/datalog.nas @@ -1,13 +1,6 @@ import.stl.sort; 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 ts=maketimestamp(); var bar=process_bar.high_resolution_bar(40); diff --git a/test/httptest.nas b/test/httptest.nas index 37bf1a9..347bf23 100644 --- a/test/httptest.nas +++ b/test/httptest.nas @@ -1,9 +1,5 @@ import.module.libsock; -for(var i=0;i<60;i+=1){ - runtime.gc.extend("str"); -} - var http=func(){ var sd=nil; return { diff --git a/test/module_test.nas b/test/module_test.nas index 0349213..37dc5cb 100644 --- a/test/module_test.nas +++ b/test/module_test.nas @@ -39,14 +39,14 @@ libfib.open(); libfib.open(); var tm=maketimestamp(); tm.stamp(); -println("[result] ",libfib.fib(40)); +println("[result] ",libfib.fib(35)); println("[time ] ",tm.elapsedMSec()," ms"); tm.stamp(); -println("[result] ",libfib.qfib(40)); +println("[result] ",libfib.qfib(35)); println("[time ] ",tm.elapsedMSec()," ms"); libfib.close(); -println("[result] ",libfib.fib(40)); -println("[result] ",libfib.qfib(40)); +println("[result] ",libfib.fib(35)); +println("[result] ",libfib.qfib(35)); libfib.close(); var speed_test=func(){ @@ -56,19 +56,22 @@ var speed_test=func(){ var vec_call=dylib.dlcall; var invoke=dylib.limitcall(1); var tm=maketimestamp(); - var duration=0; for(var t=0;t<10;t+=1){ + var cnt=0; tm.stamp(); - for(var i=0;i<5e6;i+=1) - invoke(fd,40); - duration=tm.elapsedMSec(); - println("[time ] limited call: ",duration," ms avg ",5e6/duration," call/ms"); + while(tm.elapsedMSec()<50){ + invoke(fd,35); + cnt+=1; + } + println("[time ] limited call: ",int(cnt/tm.elapsedMSec())," call/ms"); + cnt=0; tm.stamp(); - for(var i=0;i<5e6;i+=1) - vec_call(fd,40); - duration=tm.elapsedMSec(); - println("[time ] dynamic call: ",duration," ms avg ",5e6/duration," call/ms"); + while(tm.elapsedMSec()<50){ + vec_call(fd,35); + cnt+=1; + } + println("[time ] dynamic call: ",int(cnt/tm.elapsedMSec())," call/ms"); } } diff --git a/test/nasal_test.nas b/test/nasal_test.nas index 42b7b58..b430a4c 100644 --- a/test/nasal_test.nas +++ b/test/nasal_test.nas @@ -61,37 +61,39 @@ func(){ var f2=func(){var a=1;return a+1;} var f3=func(){var (a,b)=(1,1);return a+b+1;} tm.stamp(); - for(var i=0;i<1e7;i+=1); - duration=tm.elapsedMSec()/1e3; - println("total ",duration," sec, ",str(int(1e7/duration/1e6))," M calc/sec"); + for(var i=0;i<1e6;i+=1); + duration=tm.elapsedMSec(); + println(str(int(1e6/duration))," calc/ms"); tm.stamp(); - for(var i=0;i<1e7;i+=1)f1(); - duration=tm.elapsedMSec()/1e3; - println("total ",duration," sec, ",str(int(1e7/duration/1e6))," M calc/sec"); + for(var i=0;i<1e6;i+=1)f1(); + duration=tm.elapsedMSec(); + println(str(int(1e6/duration))," calc/ms"); tm.stamp(); - for(var i=0;i<1e7;i+=1)func{}(); - duration=tm.elapsedMSec()/1e3; - println("total ",duration," sec, ",str(int(1e7/duration/1e6))," M calc/sec"); + for(var i=0;i<1e6;i+=1)func{}(); + duration=tm.elapsedMSec(); + println(str(int(1e6/duration))," calc/ms"); tm.stamp(); - for(var i=0;i<1e7;i+=1)f2(); - duration=tm.elapsedMSec()/1e3; - println("total ",duration," sec, ",str(int(1e7/duration/1e6))," M calc/sec"); - for(var i=0;i<1e7;i+=1) + for(var i=0;i<1e6;i+=1)f2(); + duration=tm.elapsedMSec(); + println(str(int(1e6/duration))," calc/ms"); + tm.stamp(); + for(var i=0;i<1e6;i+=1) func{ var a=1; return a+1; }(); - duration=tm.elapsedMSec()/1e3; - println("total ",duration," sec, ",str(int(1e7/duration/1e6))," M calc/sec"); + duration=tm.elapsedMSec(); + println(str(int(1e6/duration))," calc/ms"); tm.stamp(); - for(var i=0;i<1e7;i+=1)f3(); - duration=tm.elapsedMSec()/1e3; - println("total ",duration," sec, ",str(int(1e7/duration/1e6))," M calc/sec"); - for(var i=0;i<1e7;i+=1) + for(var i=0;i<1e6;i+=1)f3(); + duration=tm.elapsedMSec(); + println(str(int(1e6/duration))," calc/ms"); + tm.stamp(); + for(var i=0;i<1e6;i+=1) func{ var (a,b)=(1,1); return a+b+1; }(); - duration=tm.elapsedMSec()/1e3; - println("total ",duration," sec, ",str(int(1e7/duration/1e6))," M calc/sec"); + duration=tm.elapsedMSec(); + println(str(int(1e6/duration))," calc/ms"); }(); \ No newline at end of file