code wiki / _hdl_build / nx_js_callcost_probe.nx

nx_js_callcost_probe.nx source

↩ module page · 48 lines · 2979 B

1// nx_js_callcost_probe.nx -- differential CALL-COST breakdown for the last >5x kernel (recursion 6.86x). 2// Kernels isolate: empty call (frame+env base) / 3-arg (arg-copy marginal) / method (receiver+IC) / fib 3// (recursion mix). V8 pins (node v22, warmed best-of-7, this box): T2=1115us T3=1078us T4=1817us T5=543us. 4// All result-verified. expect_exit: 0 license_tier: ORIGINAL 5import "nx_js_vm.nx" 6const K_MAGIC_1000000: i64 = 1000000 7const K_MAGIC_1115: i64 = 1115 8const K_MAGIC_6000000: i64 = 6000000 9const K_MAGIC_1078: i64 = 1078 10const K_MAGIC_2000000: i64 = 2000000 11const K_MAGIC_1817: i64 = 1817 12const K_MAGIC_75025: i64 = 75025 13func w(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 } 14func nn(v: i64) -> i64 { if v==0 { sys_write(1,"0" as *u8,1); return 0 } var m: i64=v; if m<0 { sys_write(1,"-" as *u8,1); m=0-m } let t: *u8=sys_mmap(24); var k: i64=0; while m>0 { t[k]=(48+(m%10)) as u8; m=m/10; k=k+1 } let o: *u8=sys_mmap(24); var q: i64=k-1; var x: i64=0; while q>=0 { o[x]=t[q]; x=x+1; q=q-1 } sys_write(1,o,x); return 0 } 15func kern(label: *u8, src: *u8, want: i64, v8us: i64) -> i64 { 16 let o: *i64 = sys_mmap(16) as *i64 17 var best: i64 = 0 18 var r: i64 = 0 19 while r < 3 { 20 let t0: i64 = sys_now_us() 21 compile_run(src, o) 22 let t1: i64 = sys_now_us() 23 var us: i64 = t1 - t0 24 if us < 1 { us = 1 } 25 if r == 0 { best = us } 26 if us < best { best = us } 27 r = r + 1 28 } 29 w(" " as *u8); w(label); w(": " as *u8); nn(best); w("us V8=" as *u8); nn(v8us) 30 w("us => " as *u8); nn(best * 100 / v8us / 100); w("." as *u8) 31 let fr: i64 = (best * 100 / v8us) - (best * 100 / v8us / 100) * 100 32 if fr < 10 { w("0" as *u8) } 33 nn(fr); w("x" as *u8) 34 if o[1] == want { w(" ok\n" as *u8); return 1 } 35 w(" WRONG (" as *u8); nn(o[1]); w(")\n" as *u8) 36 return 0 37} 38func main(argc: i64, argv: *i64) -> i64 { 39 w("=== nx_js_callcost_probe: where does the call overhead live? ===\n" as *u8) 40 var pass: i64 = 0 41 pass = pass + kern("T2 empty-call 1M " as *u8, "function f(){return 1;} var s=0; var i=0; while(i<1000000){ s=s+f(); i=i+1; } s" as *u8, K_MAGIC_1000000, K_MAGIC_1115) 42 pass = pass + kern("T3 3-arg call 1M " as *u8, "function g(a,b,c){return a+b+c;} var s=0; var i=0; while(i<1000000){ s=s+g(1,2,3); i=i+1; } s" as *u8, K_MAGIC_6000000, K_MAGIC_1078) 43 pass = pass + kern("T4 method call 1M" as *u8, "function P(){ this.v=2; } P.prototype.m=function(){ return this.v; }; var p=new P(); var s=0; var i=0; while(i<1000000){ s=s+p.m(); i=i+1; } s" as *u8, K_MAGIC_2000000, K_MAGIC_1817) 44 pass = pass + kern("T5 fib(25) " as *u8, "function fib(n){return n<2?n:fib(n-1)+fib(n-2);} fib(25)" as *u8, K_MAGIC_75025, 543) 45 if pass == 4 { w("=== GREEN: 4/4 verified (ratios above = the honest call-cost map) ===\n" as *u8); return 0 } 46 w("=== RED: a kernel returned a wrong value ===\n" as *u8) 47 return 1 48}