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}