nx_crc32c_bench.nx source
↩ module page · 58 lines · 2077 B
1// nx_crc32c_bench.nx -- MEASURED throughput of table CRC-32C vs the
2// bit-by-bit reference, 1:1 on this hardware. Shows the table speedup
3// (the perf exceed the bit-by-bit module flagged as future work).
4// license_tier: ORIGINAL
5
6import "nx_crc32c.nx"
7const K_MAGIC_2000000: i64 = 2000000
8const K_MAGIC_100000: i64 = 100000
9
10func crc32c_ref(bytes: *u8, n: i64) -> i64 {
11 var crc: i64 = 0xFFFFFFFF
12 var i: i64 = 0
13 while i < n {
14 crc = (crc ^ ((bytes[i] as i64) & 0xff)) & 0xFFFFFFFF
15 var k: i64 = 0
16 while k < 8 {
17 if (crc & 1) != 0 { crc = (crc >> 1) ^ 0x82F63B78 } else { crc = crc >> 1 }
18 k = k + 1
19 }
20 i = i + 1
21 }
22 return crc ^ 0xFFFFFFFF
23}
24func bdec(n: i64) -> i64 {
25 if n == 0 { sys_write(1, "0" as *u8, 1); return 0 }
26 var m: i64 = n
27 let d: *u8 = sys_mmap(24)
28 var k: i64 = 0
29 while m > 0 { d[k] = (0x30 + (m % 10)) as u8; m = m / 10; k = k + 1 }
30 var i: i64 = k - 1
31 while i >= 0 { let one: *u8 = sys_mmap(1); one[0] = d[i]; sys_write(1, one, 1); i = i - 1 }
32 return 0
33}
34
35func main() -> i64 {
36 let N: i64 = K_MAGIC_2000000
37 let buf: *u8 = sys_mmap(N + 16)
38 var i: i64 = 0
39 while i < N { buf[i] = ((i * 31 + 7) & 0xff) as u8; i = i + 1 }
40 let t: *i64 = crc32c_build_table()
41
42 // warm
43 let cw: i64 = crc32c_table(t, buf, K_MAGIC_100000)
44 let t0: i64 = sys_now_us()
45 let c1: i64 = crc32c_table(t, buf, N)
46 let t1: i64 = sys_now_us()
47 let c2: i64 = crc32c_ref(buf, N)
48 let t2: i64 = sys_now_us()
49 if c1 != c2 { sys_write(1, "MISMATCH\n", 9); return 1 } // table == reference
50
51 let table_mbps: i64 = N / (t1 - t0) // bytes/us = MB/s
52 let ref_mbps: i64 = N / (t2 - t1)
53 sys_write(1, "table CRC-32C: ", 15); bdec(table_mbps); sys_write(1, " MB/s ", 8)
54 sys_write(1, "bit-by-bit: ", 12); bdec(ref_mbps); sys_write(1, " MB/s speedup ~", 17)
55 bdec(table_mbps / ref_mbps); sys_write(1, "x\n", 2)
56 sys_write(1, "CRC32C BENCH DONE (table == reference, measured 1:1)\n", 52)
57 return 0
58}