libaprs-engine 0.4.0

Protocol-first APRS engine core primitives
Documentation
use std::time::{Duration, Instant};

use libaprs_engine::parse_packet;

fn main() {
    let packet = b"N0CALL>APRS,WIDE1-1:>benchmark packet";
    let iterations = 100_000;
    let started = Instant::now();

    for _ in 0..iterations {
        parse_packet(packet).expect("benchmark packet should parse");
    }

    let elapsed = started.elapsed();
    print_summary(iterations, elapsed);
    enforce_threshold(iterations, elapsed);
}

fn print_summary(iterations: u32, elapsed: Duration) {
    let nanos = elapsed.as_nanos() / u128::from(iterations);
    println!("parsed {iterations} packets in {elapsed:?} ({nanos} ns/packet)");
}

fn enforce_threshold(iterations: u32, elapsed: Duration) {
    let Ok(limit) = std::env::var("LIBAPRS_MAX_NS_PER_PACKET") else {
        return;
    };
    let limit = limit
        .parse::<u128>()
        .expect("LIBAPRS_MAX_NS_PER_PACKET must be an integer");
    let nanos = elapsed.as_nanos() / u128::from(iterations);
    assert!(
        nanos <= limit,
        "parser throughput regression: {nanos} ns/packet exceeds configured limit {limit}"
    );
}