///|
/// Reproducible local benchmark for the main zero-hardware primitives.
fn main {
  let payload : Array[Byte] = Array::make(256, 0x55)
  let clock = @clock_delay.HalClock::default_clock()
  let start = clock.get_ticks_us()
  let mut checksum = 0
  for i = 0; i < 1000; i = i + 1 {
    checksum = checksum ^ @codec.crc16_modbus(payload)
  }
  let crc_elapsed = clock.get_ticks_us() - start
  let frame_start = clock.get_ticks_us()
  let mut frame_bytes = 0
  for i = 0; i < 1000; i = i + 1 {
    frame_bytes = frame_bytes + @codec.cobs_encode(payload).length()
  }
  let frame_elapsed = clock.get_ticks_us() - frame_start
  let queue : @collections.RingQueue[Int] = @collections.RingQueue::new(128)
  let queue_start = clock.get_ticks_us()
  for i = 0; i < 1000; i = i + 1 {
    let _ = queue.push(i)
    let _ = queue.pop()
  }
  let queue_elapsed = clock.get_ticks_us() - queue_start
  println("moonbit-mcu-hal benchmark")
  println("iterations=1000 payload_bytes=256")
  println(
    "crc16_elapsed_us=" +
    crc_elapsed.to_string() +
    " checksum=" +
    checksum.to_string(),
  )
  println(
    "cobs_elapsed_us=" +
    frame_elapsed.to_string() +
    " encoded_bytes=" +
    frame_bytes.to_string(),
  )
  println(
    "queue_elapsed_us=" +
    queue_elapsed.to_string() +
    " remaining=" +
    queue.len().to_string(),
  )
}