code wiki / _hdl_build / nx_chacha_tput_probe.nx

nx_chacha_tput_probe.nx source

↩ module page · 46 lines · 1726 B

1// nx_chacha_tput_probe.nx -- decisive diagnostic for G-PART-NET: measure Nishi ChaCha20 2// throughput in isolation (16 MiB), to tell whether the ~1.9MB/s room bottleneck is the 3// CIPHER or the relay/queueing path. license_tier: ORIGINAL 4import "nx_syscalls.nx" 5import "nx_chacha20.nx" 6const K_MAGIC_4096: i64 = 4096 7const K_MAGIC_16777216: i64 = 16777216 8 9func p_w(fd: i64, s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(fd, s, n); return 0 } 10func p_wn(fd: i64, v: i64) -> i64 { 11 var m: i64 = v 12 if m < 0 { m = 0 } 13 let bb: *u8 = sys_mmap(28) 14 let t: *u8 = sys_mmap(28) 15 var k: i64 = 0 16 if m == 0 { t[0] = 48 as u8; k = 1 } 17 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 } 18 var i: i64 = 0 19 while i < k { bb[i] = t[k - 1 - i]; i = i + 1 } 20 sys_write(fd, bb, k) 21 return 0 22} 23 24func main() -> i64 { 25 let key: *u8 = sys_mmap(32) 26 let nonce: *u8 = sys_mmap(12) 27 let inb: *u8 = sys_mmap(K_MAGIC_4096) 28 let outb: *u8 = sys_mmap(K_MAGIC_4096) 29 var i: i64 = 0 30 while i < 32 { key[i] = (i & 255) as u8; i = i + 1 } 31 i = 0 32 while i < 12 { nonce[i] = 0 as u8; i = i + 1 } 33 i = 0 34 while i < K_MAGIC_4096 { inb[i] = (i & 255) as u8; i = i + 1 } 35 let t0: i64 = sys_now_us() 36 var k: i64 = 0 37 while k < K_MAGIC_4096 { chacha20_encrypt(key, 0, nonce, inb, K_MAGIC_4096, outb); k = k + 1 } 38 let t1: i64 = sys_now_us() 39 let us: i64 = t1 - t0 40 var mbps: i64 = 0 41 if us > 0 { mbps = K_MAGIC_16777216 / us } 42 p_w(1, "CHACHA20 throughput: 16 MiB in " as *u8); p_wn(1, us) 43 p_w(1, " us = ~" as *u8); p_wn(1, mbps); p_w(1, " MB/s (vs OpenSSL chacha ~500-2000 MB/s)\n" as *u8) 44 sys_exit(0) 45 return 0 46}