use std::io::{self, Write}; use std::thread; use std::time::{Duration, Instant}; mod cpu; mod gpu; mod mem; mod temp; fn parse_interval_ms() -> u64 { let args: Vec = std::env::args().collect(); let mut i = 1; while i < args.len() { if args[i] == "--interval" { if let Some(ms) = args.get(i + 1).and_then(|s| s.parse().ok()) { return ms; } } i += 1; } 1000 } fn main() { let interval = Duration::from_millis(parse_interval_ms()); let stdout = io::stdout(); let mut out = io::BufWriter::new(stdout.lock()); let mut prev: Vec = vec![]; let mut freqs: Vec = vec![]; let gpu = gpu::detect_gpu(); let mut tick = 0u64; loop { let t0 = Instant::now(); let curr = cpu::read_stat(); if tick.is_multiple_of(2) { freqs = cpu::read_core_freqs(); mem::emit_mem(&mut out); } cpu::emit_cpu(&mut out, &prev, &curr, &freqs); prev = curr; if tick.is_multiple_of(4) { temp::emit_temp(&mut out); // AMD sysfs is instant; NVIDIA calls nvidia-smi so runs less often match &gpu { gpu::GpuBackend::Amd { .. } => gpu::emit_gpu(&mut out, &gpu), gpu::GpuBackend::Nvidia if tick.is_multiple_of(8) => gpu::emit_gpu(&mut out, &gpu), _ => {} } } let _ = out.flush(); tick += 1; let elapsed = t0.elapsed(); if elapsed < interval { thread::sleep(interval - elapsed); } } }