🚀 use ftime to calculate run time

This commit is contained in:
ValKmjolnir 2022-06-02 22:51:43 +08:00
parent 04ab09586b
commit 7ec8418740
5 changed files with 49 additions and 30 deletions

View File

@ -267,14 +267,6 @@ var assert=func(condition,message="assertion failed!"){
die(message); die(message);
} }
# settimer alows infinite loop running a function with a time interval
var settimer=func(f,interval,realtime=1){
while(1){
unix.sleep(interval);
f();
}
}
# get time stamp, this will return a timestamp object # get time stamp, this will return a timestamp object
var maketimestamp=func(){ var maketimestamp=func(){
var t=0; var t=0;

View File

@ -107,9 +107,11 @@ void execute(const std::string& file,const uint32_t cmd)
} }
else if(cmd&VM_EXECTIME) else if(cmd&VM_EXECTIME)
{ {
clock_t t=clock(); timeb begin,end;
ftime(&begin);
vm.run(gen,linker,cmd&VM_OPCALLNUM,cmd&VM_DBGINFO); vm.run(gen,linker,cmd&VM_OPCALLNUM,cmd&VM_DBGINFO);
std::cout<<"process exited after "<<((double)(clock()-t))/CLOCKS_PER_SEC<<"s.\n"; ftime(&end);
std::cout<<"process exited after "<<((end.time-begin.time)*1.0+end.millitm/1000.0-begin.millitm/1000.0)<<"s.\n";
} }
else if(cmd&VM_EXEC) else if(cmd&VM_EXEC)
vm.run(gen,linker,cmd&VM_OPCALLNUM,cmd&VM_DBGINFO); vm.run(gen,linker,cmd&VM_OPCALLNUM,cmd&VM_DBGINFO);

View File

@ -22,7 +22,6 @@ var add_event=func(name,interval,function){
timestamp.stamp(); timestamp.stamp();
while(timestamp.elapsedMSec()<interval*1000) while(timestamp.elapsedMSec()<interval*1000)
coroutine.yield(); coroutine.yield();
timestamp.stamp();
println("[\e[32m",name,"\e[0m] type:\e[33mevent\e[0m interval:\e[34m",interval,"\e[0m"); println("[\e[32m",name,"\e[0m] type:\e[33mevent\e[0m interval:\e[34m",interval,"\e[0m");
function(); function();
}); });
@ -38,7 +37,6 @@ var add_task=func(name,interval,function){
timestamp.stamp(); timestamp.stamp();
while(timestamp.elapsedMSec()<interval*1000) while(timestamp.elapsedMSec()<interval*1000)
coroutine.yield(); coroutine.yield();
timestamp.stamp();
println("[\e[32m",name,"\e[0m] type:\e[34mtask\e[0m interval:\e[34m",interval,"\e[0m invoke-time:\e[96m",counter,"\e[0m"); println("[\e[32m",name,"\e[0m] type:\e[34mtask\e[0m interval:\e[34m",interval,"\e[0m invoke-time:\e[96m",counter,"\e[0m");
function(); function();
coroutine.yield(); coroutine.yield();
@ -91,12 +89,24 @@ var maketimer=func(interval,function){
return res; return res;
} }
println("[\e[32m settimer \e[0m] new func settimer(function,interval,rt)");
var settimer=func(){
var index=0;
return func(function,interval,realtime=1){
var name="nasal-settimer-"~index;
index+=1;
add_task(name,interval,function);
}
}();
println("[\e[32m maketimer \e[0m] test func simulation()"); println("[\e[32m maketimer \e[0m] test func simulation()");
var simulation=func(){ var simulation=func(){
var running=1; var running=1;
while(running){ while(running){
running=0; running=0;
foreach(var i;keys(fg_globals.task)){ foreach(var i;keys(fg_globals.task)){
if(!contains(fg_globals.task,i))
continue;
if(coroutine.resume(fg_globals.task[i])!=nil){ if(coroutine.resume(fg_globals.task[i])!=nil){
running=1; running=1;
}else{ }else{
@ -104,6 +114,8 @@ var simulation=func(){
} }
} }
foreach(var i;keys(fg_globals.event)){ foreach(var i;keys(fg_globals.event)){
if(!contains(fg_globals.event,i))
continue;
if(coroutine.resume(fg_globals.event[i])!=nil){ if(coroutine.resume(fg_globals.event[i])!=nil){
running=1; running=1;
}else{ }else{
@ -115,32 +127,43 @@ var simulation=func(){
println("[\e[32m maketimer \e[0m] test func maketimer_multi_coroutine_test(size)"); println("[\e[32m maketimer \e[0m] test func maketimer_multi_coroutine_test(size)");
var maketimer_multi_coroutine_test=func(coroutine_size){ var maketimer_multi_coroutine_test=func(coroutine_size){
if(coroutine_size<1)
return;
var task_vec=[]; var task_vec=[];
setsize(task_vec,coroutine_size); setsize(task_vec,coroutine_size);
forindex(var i;task_vec) forindex(var i;task_vec)
task_vec[i]=func{}; task_vec[i]=func{};
task_vec[coroutine_size-1]=func(){ task_vec[coroutine_size-1]=func{
println("\e[101m",coroutine_size," tasks invoked.\e[0m"); println("\e[101m",coroutine_size," tasks invoked.\e[0m");
forindex(var i;task_vec)
task_vec[i].stop();
} }
var event_vec=[]; var event_vec=[];
setsize(event_vec,coroutine_size); setsize(event_vec,coroutine_size);
forindex(var i;event_vec) forindex(var i;event_vec)
event_vec[i]=func{}; event_vec[i]=func{};
event_vec[coroutine_size-1]=func(){ event_vec[coroutine_size-1]=func{
println("\e[101m",coroutine_size," events invoked.\e[0m"); println("\e[101m",coroutine_size," events invoked.\e[0m");
} }
var set_vec=[];
setsize(set_vec,coroutine_size);
forindex(var i;set_vec)
set_vec[i]=func{};
set_vec[coroutine_size-1]=func{
println("\e[101m",coroutine_size," settimer invoked.\e[0m");
}
var timer=[];
setsize(timer,coroutine_size*2);
forindex(var i;task_vec){ forindex(var i;task_vec){
timer[i]=maketimer((i+1)/5,task_vec[i]); task_vec[i]=maketimer((i+1)/10,task_vec[i]);
timer[i].start(); task_vec[i].start();
} }
forindex(var i;event_vec){ forindex(var i;event_vec){
timer[i+coroutine_size-1]=maketimer((i+1)/5,event_vec[i]); event_vec[i]=maketimer((i+1)/10,event_vec[i]);
timer[i+coroutine_size-1].singleShot=1; event_vec[i].singleShot=1;
timer[i+coroutine_size-1].start(); event_vec[i].start();
} }
#forindex(var i;set_vec)
# settimer(set_vec[i],(i+1)/10);
simulation(); simulation();
} }

View File

@ -24,3 +24,13 @@ var file={
}; };
} }
}; };
var find_all_files=func(path){
var dd=unix.opendir(path);
var res=[];
while(var n=unix.readdir(dd))
if(unix.isfile(path~"/"~n))
append(res,n);
unix.closedir(dd);
return res;
}

View File

@ -267,14 +267,6 @@ var assert=func(condition,message="assertion failed!"){
die(message); die(message);
} }
# settimer alows infinite loop running a function with a time interval
var settimer=func(f,interval,realtime=1){
while(1){
unix.sleep(interval);
f();
}
}
# get time stamp, this will return a timestamp object # get time stamp, this will return a timestamp object
var maketimestamp=func(){ var maketimestamp=func(){
var t=0; var t=0;