From c8d71bd8712d5bc28868823f360097f9925fe6d7 Mon Sep 17 00:00:00 2001 From: Damocles Date: Wed, 15 Apr 2026 18:58:24 +0200 Subject: [PATCH] perf: merge cpuCoreUsage/cpuCoreFreq/cpuCoreHistory into single cpuCores array --- modules/Cpu.qml | 12 +++++------- modules/SystemStats.qml | 24 +++++++++++------------- stats-daemon/src/main.rs | 23 +++++++++-------------- 3 files changed, 25 insertions(+), 34 deletions(-) diff --git a/modules/Cpu.qml b/modules/Cpu.qml index cfe49c1..e3fd9f8 100644 --- a/modules/Cpu.qml +++ b/modules/Cpu.qml @@ -22,9 +22,7 @@ M.BarSection { } } - readonly property var _coreUsage: M.SystemStats.cpuCoreUsage - readonly property var _coreFreq: M.SystemStats.cpuCoreFreq - readonly property var _coreHistory: M.SystemStats.cpuCoreHistory + readonly property var _cores: M.SystemStats.cpuCores readonly property var _coreMaxFreq: M.SystemStats.cpuCoreMaxFreq readonly property var _coreTypes: M.SystemStats.cpuCoreTypes @@ -114,14 +112,14 @@ M.BarSection { // Per-core rows Repeater { - model: root._coreUsage.length + model: root._cores.length delegate: Item { required property int index width: hoverPanel.contentWidth - readonly property int _u: root._coreUsage[index] ?? 0 - readonly property real _f: root._coreFreq[index] ?? 0 + readonly property int _u: root._cores[index]?.usage ?? 0 + readonly property real _f: root._cores[index]?.freq_ghz ?? 0 readonly property color _barColor: root._loadColor(_u) readonly property bool _throttled: { const maxF = root._coreMaxFreq[index] ?? 0; @@ -204,7 +202,7 @@ M.BarSection { width: 32 height: 10 - property var _hist: root._coreHistory[parent.parent.index] || [] + property var _hist: root._cores[parent.parent.index]?.history ?? [] property color _col: parent.parent._barColor on_HistChanged: if (root._showPanel) diff --git a/modules/SystemStats.qml b/modules/SystemStats.qml index fd0c20d..16c264d 100644 --- a/modules/SystemStats.qml +++ b/modules/SystemStats.qml @@ -10,9 +10,7 @@ QtObject { // ── CPU ────────────────────────────────────────────────────────────── property int cpuUsage: 0 property real cpuFreqGhz: 0 - property var cpuCoreUsage: [] - property var cpuCoreFreq: [] - property var cpuCoreHistory: [] + property var cpuCores: [] // [{usage, freq_ghz, history:[]}] property var cpuCoreMaxFreq: [] property var cpuCoreTypes: [] @@ -40,17 +38,17 @@ QtObject { if (ev.type === "cpu") { root.cpuUsage = ev.usage; root.cpuFreqGhz = ev.freq_ghz; - root.cpuCoreUsage = ev.core_usage; - root.cpuCoreFreq = ev.core_freq_ghz; const histLen = 16; - const oldH = root.cpuCoreHistory; - const newH = []; - for (let i = 0; i < ev.core_usage.length; i++) { - const prev = i < oldH.length ? oldH[i] : []; - const next = prev.concat([ev.core_usage[i]]); - newH.push(next.length > histLen ? next.slice(next.length - histLen) : next); - } - root.cpuCoreHistory = newH; + const prev = root.cpuCores; + root.cpuCores = ev.cores.map((c, i) => { + const oldHist = prev[i]?.history ?? []; + const hist = oldHist.concat([c.usage]); + return { + usage: c.usage, + freq_ghz: c.freq_ghz, + history: hist.length > histLen ? hist.slice(hist.length - histLen) : hist + }; + }); } else if (ev.type === "mem") { root.memPercent = ev.percent; root.memUsedGb = ev.used_gb; diff --git a/stats-daemon/src/main.rs b/stats-daemon/src/main.rs index 1324530..7153961 100644 --- a/stats-daemon/src/main.rs +++ b/stats-daemon/src/main.rs @@ -132,22 +132,18 @@ fn emit_cpu(out: &mut impl Write, prev: &[Sample], curr: &[Sample], freqs: &[f64 freqs.iter().sum::() / freqs.len() as f64 }; + let n = core_usage.len().max(freqs.len()); let _ = write!( out, - "{{\"type\":\"cpu\",\"usage\":{usage},\"freq_ghz\":{avg_freq:.3},\"core_usage\":[" + "{{\"type\":\"cpu\",\"usage\":{usage},\"freq_ghz\":{avg_freq:.3},\"cores\":[" ); - for (i, u) in core_usage.iter().enumerate() { + for i in 0..n { if i > 0 { let _ = write!(out, ","); } - let _ = write!(out, "{u}"); - } - let _ = write!(out, "],\"core_freq_ghz\":["); - for (i, f) in freqs.iter().enumerate() { - if i > 0 { - let _ = write!(out, ","); - } - let _ = write!(out, "{f:.3}"); + let u = core_usage.get(i).copied().unwrap_or(0); + let f = freqs.get(i).copied().unwrap_or(0.0); + let _ = write!(out, "{{\"usage\":{u},\"freq_ghz\":{f:.3}}}"); } let _ = writeln!(out, "]}}"); } @@ -360,8 +356,7 @@ SwapFree: 8192000 kB"; assert!(s.contains("\"type\":\"cpu\"")); assert!(s.contains("\"usage\":")); assert!(s.contains("\"freq_ghz\":")); - assert!(s.contains("\"core_usage\":")); - assert!(s.contains("\"core_freq_ghz\":")); + assert!(s.contains("\"cores\":")); assert!(s.trim().ends_with('}')); } @@ -399,8 +394,8 @@ SwapFree: 8192000 kB"; let mut buf = Vec::new(); emit_cpu(&mut buf, &curr, &curr, &freqs); let s = String::from_utf8(buf).unwrap(); - assert!(s.contains("3.200"), "got: {s}"); - assert!(s.contains("2.900"), "got: {s}"); + assert!(s.contains("\"freq_ghz\":3.200"), "got: {s}"); + assert!(s.contains("\"freq_ghz\":2.900"), "got: {s}"); } // ── emit_mem (via parse_meminfo) ─────────────────────────────────────