code wiki / (root) / nx_crc32c_bench.nx

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}