code wiki / bin / nx_bench_comb.nx

nx_bench_comb.nx source

↩ module page · 47 lines · 1778 B

1// nx_bench_comb.nx -- isolated bench: comb fixed-base k*G (bits-up path). 2import "nx_syscalls.nx" 3import "nx_csprng.nx" 4import "nx_u256.nx" 5import "nx_p256_point.nx" 6import "nx_p256_scalar_mul.nx" 7import "nx_p256_comb.nx" 8 9func bstrlen(s: *u8) -> i64 { var n: i64 = 0; while s[n] != 0 { n = n + 1 } return n } 10func bprint(label: *u8, total_us: i64, n: i64) -> i64 { 11 sys_write(1, label, bstrlen(label)); sys_write(1, "=" as *u8, 1) 12 let per: i64 = total_us / n 13 let buf: *u8 = sys_mmap(24); var d: i64 = 0 14 if per == 0 { buf[0] = 48; d = 1 } else { 15 var x: i64 = per; var c: i64 = 0 16 while x > 0 { c = c + 1; x = x / 10 } 17 d = c; var i: i64 = d - 1; x = per 18 while i >= 0 { buf[i] = (48 + (x % 10)) as u8; x = x / 10; i = i - 1 } 19 } 20 sys_write(1, buf, d); sys_write(1, " us/op N=" as *u8, 9) 21 let b2: *u8 = sys_mmap(24); var d2: i64 = 0 22 if n == 0 { b2[0]=48; d2=1 } else { 23 var x2: i64 = n; var c2: i64 = 0 24 while x2 > 0 { c2 = c2 + 1; x2 = x2 / 10 } 25 d2 = c2; var i2: i64 = d2 - 1; x2 = n 26 while i2 >= 0 { b2[i2] = (48 + (x2 % 10)) as u8; x2 = x2 / 10; i2 = i2 - 1 } 27 } 28 sys_write(1, b2, d2); sys_write(1, "\n" as *u8, 1) 29 return 0 30} 31 32func main() -> i64 { 33 let table: *i64 = (sys_mmap(NX_P256_COMB_BYTES)) as *i64 34 p256_comb_build(table) 35 let k: *i64 = u256_alloc() 36 let be: *u8 = sys_mmap(32) 37 nx_csprng_fill(be, 32); be[0] = 0 38 u256_load_be(k, be) 39 let pout: *P256Point = p256_point_alloc() 40 var t0: i64 = 0; var i: i64 = 0 41 p256_scalar_mul_base(pout, k, table) 42 let NC: i64 = 80 43 t0 = sys_now_us(); i = 0 44 while i < NC { p256_scalar_mul_base(pout, k, table); i = i + 1 } 45 bprint("p256_kG_comb " as *u8, sys_now_us() - t0, NC) 46 return 0 47}