improve performance for cpu line parser

This commit is contained in:
csehviktor
2025-07-10 21:02:57 +02:00
parent 6225a45848
commit ef420a78af
+26 -18
View File
@@ -1,7 +1,8 @@
use std::collections::HashMap; use std::collections::HashMap;
use anyhow::anyhow;
use common::metrics::CPUBreakdown; use common::metrics::CPUBreakdown;
#[derive(Debug, Clone, Copy)] #[derive(Default, Debug, Clone, Copy)]
struct CPUValues { struct CPUValues {
pub user: u64, pub user: u64,
pub nice: u64, pub nice: u64,
@@ -43,26 +44,33 @@ impl CPUStatReader {
} }
fn parse_cpu_line(&mut self, line: &str) -> anyhow::Result<CPUBreakdown> { fn parse_cpu_line(&mut self, line: &str) -> anyhow::Result<CPUBreakdown> {
let parts: Vec<&str> = line.split_whitespace().collect(); let mut parts = line.split_whitespace();
let cpu_name = parts[0].to_string(); let cpu_name = parts.next()
.ok_or_else(|| anyhow!("missing cpu name"))?
.to_string();
let parse = |num: usize| -> u64 { let mut values = CPUValues::default();
parts[num].parse().ok().unwrap() let mut fields = [
}; &mut values.user,
&mut values.nice,
&mut values.system,
&mut values.idle,
&mut values.iowait,
&mut values.irq,
&mut values.softirq,
&mut values.steal,
&mut values.guest,
&mut values.guest_nice,
];
let values = CPUValues { for (field, part) in fields.iter_mut().zip(&mut parts) {
user: parse(1), **field = part.parse()?;
nice: parse(2), }
system: parse(3),
idle: parse(4), if fields.iter().any(|f| **f == 0 && parts.next().is_some()) {
iowait: parse(5), return Err(anyhow!("invalid cpu line"));
irq: parse(6), }
softirq: parse(7),
steal: parse(8),
guest: parse(9),
guest_nice: parse(10),
};
let previous = self.previous_stats.get(&cpu_name).copied(); let previous = self.previous_stats.get(&cpu_name).copied();
let percentages = self.calculate_percentages(&values, previous); let percentages = self.calculate_percentages(&values, previous);