subetha-cxc 0.1.12

MMF-backed cross-process IPC primitives for SubEtha: SharedRing, SharedHashMap, SharedRWLock, SharedSemaphore, SharedLRUCache, OwnerLease, HeartbeatTable, plus 30+ more. One byte layout serves cross-thread, cross-process, and disk-persistent.
Documentation
//! Micro-bench: is the GF(256) RS parity encode the throughput ceiling?
use std::time::Instant;
use subetha_cxc::fec::RsCode;

fn main() {
    let (k, r, len) = (8usize, 2usize, 1408usize);
    let code = RsCode::new(k, r).expect("rs");
    let data: Vec<Vec<u8>> = (0..k).map(|i| vec![(i * 37 + 1) as u8; len]).collect();
    let drefs: Vec<&[u8]> = data.iter().map(|v| v.as_slice()).collect();
    let mut parity: Vec<Vec<u8>> = vec![vec![0u8; len]; r];
    let iters = 200_000u64;
    let t = Instant::now();
    for _ in 0..iters {
        let mut prefs: Vec<&mut [u8]> = parity.iter_mut().map(|v| v.as_mut_slice()).collect();
        code.encode(&drefs, &mut prefs).expect("encode");
    }
    let secs = t.elapsed().as_secs_f64();
    let data_gbit = iters as f64 * (k * len) as f64 * 8.0 / secs / 1e9;
    println!("scalar RS encode: {data_gbit:.2} Gbit/s of data, {:.0} blocks/s", iters as f64 / secs);
}