🚀 add gc time info

This commit is contained in:
ValKmjolnir 2022-11-04 21:36:54 +08:00
parent cedb5e12f5
commit 1ced201cb5
2 changed files with 127 additions and 111 deletions

View File

@ -3,6 +3,7 @@
#include <vector> #include <vector>
#include <queue> #include <queue>
#include <unordered_map> #include <unordered_map>
#include <chrono>
#include "nasal_err.h" #include "nasal_err.h"
@ -482,10 +483,13 @@ struct gc
u64 size[gc_tsize]; u64 size[gc_tsize];
u64 count[gc_tsize]; u64 count[gc_tsize];
u64 acnt[gc_tsize]; u64 acnt[gc_tsize];
i64 worktime;
gc(u32& _pc, var*& _localr, var*& _memr, var& _funcr, gc(u32& _pc, var*& _localr, var*& _memr, var& _funcr,
var& _upvalr, var*& _canary, var*& _top, var* _stk): var& _upvalr, var*& _canary, var*& _top, var* _stk):
pc(_pc),localr(_localr),memr(_memr),funcr(_funcr),upvalr(_upvalr), pc(_pc),localr(_localr),memr(_memr),funcr(_funcr),upvalr(_upvalr),
canary(_canary),top(_top),stack(_stk),cort(nullptr),temp(nil){} canary(_canary),top(_top),stack(_stk),cort(nullptr),temp(nil),
worktime(0){}
void mark(); void mark();
void sweep(); void sweep();
void init(const std::vector<string>&,const std::vector<string>&); void init(const std::vector<string>&,const std::vector<string>&);
@ -573,6 +577,7 @@ void gc::init(const std::vector<string>& s,const std::vector<string>& argv)
{ {
// initiaize function register // initiaize function register
funcr=nil; funcr=nil;
worktime=0;
for(u8 i=0;i<gc_tsize;++i) for(u8 i=0;i<gc_tsize;++i)
size[i]=count[i]=acnt[i]=0; size[i]=count[i]=acnt[i]=0;
@ -616,11 +621,12 @@ void gc::clear()
} }
void gc::info() void gc::info()
{ {
const char* name[]={"str ","vec ","hash ","func ","upval","obj ","co "}; const char* name[]={" str"," vec"," hash"," func","upval"," obj"," co"};
std::cout<<"\ngarbage collector info(gc/alloc)\n"; std::cout<<"\ngarbage collector info(gc/alloc)\n";
for(u8 i=0;i<gc_tsize;++i) for(u8 i=0;i<gc_tsize;++i)
if(count[i] || acnt[i]) if(count[i] || acnt[i])
std::cout<<" "<<name[i]<<" | "<<count[i]<<","<<acnt[i]<<"\n"; std::cout<<" "<<name[i]<<" | "<<count[i]<<","<<acnt[i]<<"\n";
std::cout<<" time | "<<(worktime*1.0/1000000000)<<"s\n";
std::cout<<"\nmemory allocator info(max size)\n"; std::cout<<"\nmemory allocator info(max size)\n";
for(u8 i=0;i<gc_tsize;++i) for(u8 i=0;i<gc_tsize;++i)
if(ini[i] || size[i]) if(ini[i] || size[i])
@ -633,8 +639,10 @@ var gc::alloc(u8 type)
if(unused[index].empty()) if(unused[index].empty())
{ {
++count[index]; ++count[index];
auto begin=std::chrono::high_resolution_clock::now();
mark(); mark();
sweep(); sweep();
worktime+=(std::chrono::high_resolution_clock::now()-begin).count();
} }
if(unused[index].empty()) if(unused[index].empty())
{ {

View File

@ -22,48 +22,53 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE. # SOFTWARE.
var t=[]; func(){
for(var i=0;i<8192;i+=1) # allocate more spaces
append(t,{}); var t=[];
t=[]; for(var i=0;i<2048;i+=1)
append(t,[],[],[],str(i));
t=[];
}();
var (max,min,sqrt,sin,cos,abs)=(math.max,math.min,math.sqrt,math.sin,math.cos,math.abs);
var vec2=func(x,y){ var vec2=func(x,y){
return {x:x,y:y}; return [x,y];
} }
var vec2add=func(v1,v2){ var vec2add=func(v1,v2){
return vec2(v1.x+v2.x,v1.y+v2.y); return [v1[0]+v2[0],v1[1]+v2[1]];
} }
var vec2sub=func(v1,v2){ var vec2sub=func(v1,v2){
return vec2(v1.x-v2.x,v1.y-v2.y); return [v1[0]-v2[0],v1[1]-v2[1]];
} }
var vec2mul=func(v1,v2){ var vec2mul=func(v1,v2){
return vec2(v1.x*v2.x,v1.y*v2.y); return [v1[0]*v2[0],v1[1]*v2[1]];
} }
var vec2div=func(v1,v2){ var vec2div=func(v1,v2){
return vec2(v1.x/v2.x,v1.y/v2.y); return [v1[0]/v2[0],v1[1]/v2[1]];
} }
var vec3=func(x,y,z){ var vec3=func(x,y,z){
return {x:x,y:y,z:z}; return [x,y,z];
} }
var vec3add=func(v1,v2){ var vec3add=func(v1,v2){
return vec3(v1.x+v2.x,v1.y+v2.y,v1.z+v2.z); return [v1[0]+v2[0],v1[1]+v2[1],v1[2]+v2[2]];
} }
var vec3sub=func(v1,v2){ var vec3sub=func(v1,v2){
return vec3(v1.x-v2.x,v1.y-v2.y,v1.z-v2.z); return [v1[0]-v2[0],v1[1]-v2[1],v1[2]-v2[2]];
} }
var vec3mul=func(v1,v2){ var vec3mul=func(v1,v2){
return vec3(v1.x*v2.x,v1.y*v2.y,v1.z*v2.z); return [v1[0]*v2[0],v1[1]*v2[1],v1[2]*v2[2]];
} }
var vec3div=func(v1,v2){ var vec3div=func(v1,v2){
return vec3(v1.x/v2.x,v1.y/v2.y,v1.z/v2.z); return [v1[0]/v2[0],v1[1]/v2[1],v1[2]/v2[2]];
} }
var vec3neg=func(v){ var vec3neg=func(v){
return vec3(-v.x,-v.y,-v.z); return [-v[0],-v[1],-v[2]];
} }
var clamp=func(value,_min,_max){ var clamp=func(value,_min,_max){
return math.max(math.min(value,_max),_min); return max(min(value,_max),_min);
} }
var sign=func(a){ var sign=func(a){
return (0<a)-(a<0); return (0<a)-(a<0);
@ -72,81 +77,84 @@ var step=func(edge,x){
return x>edge; return x>edge;
} }
var vec2len=func(v){ var vec2len=func(v){
return math.sqrt(v.x*v.x+v.y*v.y); return sqrt(v[0]*v[0]+v[1]*v[1]);
} }
var vec3len=func(v){ var vec3len=func(v){
return math.sqrt(v.x*v.x+v.y*v.y+v.z*v.z); return sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]);
} }
var vec3norm=func(v){ var vec3norm=func(v){
var t=vec3len(v); var t=vec3len(v);
return vec3div(v,vec3(t,t,t)); return vec3div(v,[t,t,t]);
} }
var vec3dot=func(a,b){ var vec3dot=func(a,b){
return a.x*b.x+a.y*b.y+a.z*b.z; return a[0]*b[0]+a[1]*b[1]+a[2]*b[2];
} }
var vec3abs=func(v){ var vec3abs=func(v){
return vec3(math.abs(v.x),math.abs(v.y),math.abs(v.z)); return [abs(v[0]),abs(v[1]),abs(v[2])];
} }
var vec3sign=func(v){ var vec3sign=func(v){
return vec3(sign(v.x),sign(v.y),sign(v.z)); return [sign(v[0]),sign(v[1]),sign(v[2])];
} }
var vec3step=func(edge,v){ var vec3step=func(edge,v){
return vec3(step(edge.x,v.x),step(edge.y,v.y),step(edge.z,v.z)); return [step(edge[0],v[0]),step(edge[1],v[1]),step(edge[2],v[2])];
} }
var vec3reflect=func(rd,n){ var vec3reflect=func(rd,n){
var d=vec3dot(n,rd); var d=vec3dot(n,rd);
return vec3sub(rd,vec3mul(n,vec3mul(vec3(2,2,2),vec3(d,d,d)))); return vec3sub(rd,vec3mul(n,vec3mul([2,2,2],[d,d,d])));
} }
var rotateX=func(a,angle){ var rotateX=func(a,angle){
var b=vec3(a.x,a.y,a.z); return [
b.z=a.z*math.cos(angle)-a.y*math.sin(angle); a[0],
b.y=a.z*math.sin(angle)+a.y*math.cos(angle); a[2]*sin(angle)+a[1]*cos(angle),
return b; a[2]*cos(angle)-a[1]*sin(angle)
];
} }
var rotateY=func(a,angle) var rotateY=func(a,angle)
{ {
var b=vec3(a.x,a.y,a.z); return [
b.x=a.x*math.cos(angle)-a.z*math.sin(angle); a[0]*cos(angle)-a[2]*sin(angle),
b.z=a.x*math.sin(angle)+a.z*math.cos(angle); a[1],
return b; a[0]*sin(angle)+a[2]*cos(angle)
];
} }
var rotateZ=func(a,angle) var rotateZ=func(a,angle)
{ {
var b=vec3(a.x,a.y,a.z); return [
b.x=a.x*math.cos(angle)-a.y*math.sin(angle); a[0]*cos(angle)-a[1]*sin(angle),
b.y=a.x*math.sin(angle)+a.y*math.cos(angle); a[0]*sin(angle)+a[1]*cos(angle),
return b; a[2]
];
} }
var sphere=func(ro,rd,r) { var sphere=func(ro,rd,r) {
var b=vec3dot(ro,rd); var b=vec3dot(ro,rd);
var c=vec3dot(ro,ro)-r*r; var c=vec3dot(ro,ro)-r*r;
var h=b*b-c; var h=b*b-c;
if(h<0.0) return vec2(-1.0,-1.0); if(h<0.0) return [-1.0,-1.0];
h=math.sqrt(h); h=sqrt(h);
return vec2(-b-h,-b+h); return [-b-h,-b+h];
} }
var box=func(ro,rd,boxSize,outNormal) { var box=func(ro,rd,boxSize,outNormal) {
var m=vec3div(vec3(1.0,1.0,1.0),rd); var m=vec3div([1.0,1.0,1.0],rd);
var n=vec3mul(m,ro); var n=vec3mul(m,ro);
var k=vec3mul(vec3abs(m),boxSize); var k=vec3mul(vec3abs(m),boxSize);
var t1=vec3sub(vec3neg(n),k); var t1=vec3sub(vec3neg(n),k);
var t2=vec3add(vec3neg(n),k); var t2=vec3add(vec3neg(n),k);
var tN=math.max(math.max(t1.x,t1.y),t1.z); var tN=max(max(t1[0],t1[1]),t1[2]);
var tF=math.min(math.min(t2.x,t2.y),t2.z); var tF=min(min(t2[0],t2[1]),t2[2]);
if (tN>tF or tF<0.0) return vec2(-1.0,-1.0); if (tN>tF or tF<0.0) return [-1.0,-1.0];
var yzx=vec3(t1.y,t1.z,t1.x); var yzx=[t1[1],t1[2],t1[0]];
var zxy=vec3(t1.z,t1.x,t1.y); var zxy=[t1[2],t1[0],t1[1]];
var tmp=vec3mul(vec3mul(vec3neg(vec3sign(rd)), vec3step(yzx,t1)),vec3step(zxy, t1)); var tmp=vec3mul(vec3mul(vec3neg(vec3sign(rd)), vec3step(yzx,t1)),vec3step(zxy,t1));
outNormal.x=tmp.x; outNormal[0]=tmp[0];
outNormal.y=tmp.y; outNormal[1]=tmp[1];
outNormal.z=tmp.z; outNormal[2]=tmp[2];
return vec2(tN, tF); return [tN, tF];
} }
var plane=func(ro,rd,p,w) { var plane=func(ro,rd,p,w) {
@ -154,80 +162,80 @@ var plane=func(ro,rd,p,w) {
} }
var main=func() { var main=func() {
var width=68*2;
var height=17*2;
var aspect=width/height; var height=15*2;
var pixelAspect=11.0/24.0; var width=int(height*1600/900)*2;
var gradient=split(""," .:!/r(l1Z4H9W8$@"); var aspect=width/height;
var gradientSize=size(gradient)-2; var pixelAspect=11.0/24.0;
var gradient=split(""," .:!/r(l1Z4H9W8$");
var gradientSize=size(gradient)-1;
var screen=[]; var screen=[];
setsize(screen,width*height); setsize(screen,width*height);
print("\e[2J"); print("\e[2J");
var stamp=maketimestamp(); var stamp=maketimestamp();
for(var t=0;t<10000;t+=1){ for(var t=0;t<1e3;t+=1){
stamp.stamp(); stamp.stamp();
var light=vec3norm(vec3(-0.5,0.5,-1.0)); var light=vec3norm([-0.5,0.5,-1.0]);
var spherePos=vec3(0,3,0); var spherePos=[0,3,0];
for(var i=0;i<width;i+=1){ for(var i=0;i<width;i+=1){
for(var j=0;j<height;j+=1){ for(var j=0;j<height;j+=1){
var uv=vec2sub(vec2mul(vec2div(vec2(i,j),vec2(width,height)),vec2(2.0,2.0)),vec2(1.0,1.0)); var uv=vec2sub(vec2mul(vec2div([i,j],[width,height]),[2.0,2.0]),[1.0,1.0]);
uv.x*=aspect*pixelAspect; uv[0]*=aspect*pixelAspect;
var ro=vec3(-6,0,0); var ro=[-6,0,0];
var rd=vec3norm(vec3(2,uv.x,uv.y)); var rd=vec3norm([2,uv[0],uv[1]]);
ro=rotateY(ro,0.25); ro=rotateY(ro,0.25);
rd=rotateY(rd,0.25); rd=rotateY(rd,0.25);
ro=rotateZ(ro,t*0.025); ro=rotateZ(ro,t*0.025);
rd=rotateZ(rd,t*0.025); rd=rotateZ(rd,t*0.025);
var diff = 1; var diff=1;
for (var k=0;k<5;k+=1){ for (var k=0;k<5;k+=1){
var minIt=99999; var minIt=99999;
var intersection=sphere(vec3sub(ro,spherePos),rd,1); var intersection=sphere(vec3sub(ro,spherePos),rd,1);
var n=vec3(0,0,0); var n=[0,0,0];
var albedo=1; var albedo=1;
if(intersection.x>0){ if(intersection[0]>0){
var itPoint=vec3add(vec3sub(ro,spherePos),vec3mul(rd,vec3(intersection.x,intersection.x,intersection.x))); var itPoint=vec3add(vec3sub(ro,spherePos),vec3mul(rd,[intersection[0],intersection[0],intersection[0]]));
minIt= intersection.x; minIt= intersection[0];
n=vec3norm(itPoint); n=vec3norm(itPoint);
} }
var boxN=vec3(0,0,0); var boxN=[0,0,0];
intersection=box(ro,rd,vec3(1,1,1),boxN); intersection=box(ro,rd,[1,1,1],boxN);
if(intersection.x>0 and intersection.x<minIt){ if(intersection[0]>0 and intersection[0]<minIt){
minIt=intersection.x; minIt=intersection[0];
n=boxN; n=boxN;
} }
var tmp=plane(ro,rd,vec3(0,0,-1),1); var tmp=plane(ro,rd,[0,0,-1],1);
intersection=vec2(tmp,tmp); intersection=[tmp,tmp];
if(intersection.x>0 and intersection.x<minIt){ if(intersection[0]>0 and intersection[0]<minIt){
minIt=intersection.x; minIt=intersection[0];
n=vec3(0,0,-1); n=[0,0,-1];
albedo=0.5; albedo=0.5;
} }
if(minIt<99999){ if(minIt<99999){
diff*=(vec3dot(n,light)*0.5+0.5)*albedo; diff*=(vec3dot(n,light)*0.5+0.5)*albedo;
ro=vec3add(ro,vec3mul(rd,vec3(minIt-0.01,minIt-0.01,minIt-0.01))); ro=vec3add(ro,vec3mul(rd,[minIt-0.01,minIt-0.01,minIt-0.01]));
rd=vec3reflect(rd, n); rd=vec3reflect(rd,n);
} }
else break; else break;
} }
var color=int(diff*20); var color=int(diff*20);
color=clamp(color,0,gradientSize); color=clamp(color,0,gradientSize);
screen[i+j*width]=gradient[color]; screen[i+j*width]=gradient[color];
} }
} }
var s=""; var s="";
forindex(var index;screen){ forindex(var index;screen){
s~=screen[index]; s~=screen[index];
if(index+1-int((index+1)/width)*width==0) if(index+1-int((index+1)/width)*width==0)
s~="\n"; s~="\n";
} }
var elt=stamp.elapsedMSec()/1000; var elt=stamp.elapsedMSec()/1000;
println("\e[H",1/elt," fps\n",s); print("\e[H",int(1/elt)," fps \n",s);
}
}
} }
main(); main();