65 lines
1.7 KiB
Rust
65 lines
1.7 KiB
Rust
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<String> = 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<cpu::Sample> = vec![];
|
|
let mut freqs: Vec<f64> = vec![];
|
|
let mut 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/Intel read sysfs (instant); NVIDIA shells out so runs less often
|
|
let emit = match &gpu {
|
|
gpu::GpuBackend::Amd { .. } | gpu::GpuBackend::Intel { .. } => true,
|
|
gpu::GpuBackend::Nvidia => tick.is_multiple_of(8),
|
|
gpu::GpuBackend::None => false,
|
|
};
|
|
if emit {
|
|
gpu::emit_gpu(&mut out, &mut gpu);
|
|
}
|
|
}
|
|
|
|
let _ = out.flush();
|
|
tick += 1;
|
|
|
|
let elapsed = t0.elapsed();
|
|
if let Some(remaining) = interval.checked_sub(elapsed) {
|
|
thread::sleep(remaining);
|
|
}
|
|
}
|
|
}
|