diff options
author | Dennis Kobert <dennis@kobert.dev> | 2025-04-02 17:51:36 +0200 |
---|---|---|
committer | Dennis Kobert <dennis@kobert.dev> | 2025-04-02 17:51:36 +0200 |
commit | 5de74c2aefd1b44e3f0fb33de18b838f3ab1ed68 (patch) | |
tree | 0d07477101b4292461ffb1629677484fd4c4a320 | |
parent | a56c2e8ab39d7247d2b4c8959c306ffa07520d01 (diff) |
Improve performance of energy monitor significantly
-rw-r--r-- | energy-monitor/src/energy.rs | 6 | ||||
-rw-r--r-- | energy-monitor/src/process.rs | 27 | ||||
-rw-r--r-- | energy-monitor/src/ui.rs | 6 |
3 files changed, 30 insertions, 9 deletions
diff --git a/energy-monitor/src/energy.rs b/energy-monitor/src/energy.rs index 55b6e53..808b990 100644 --- a/energy-monitor/src/energy.rs +++ b/energy-monitor/src/energy.rs @@ -16,12 +16,12 @@ pub struct ProcessInfo { } impl ProcessInfo { - pub fn new(pid: Pid, name: String) -> Self { + pub fn new(pid: Pid, name: String, energy: f64, tree_energy: f64) -> Self { Self { pid, name, - energy: 0., - tree_energy: 0., + energy, + tree_energy, history: Vec::new(), } } diff --git a/energy-monitor/src/process.rs b/energy-monitor/src/process.rs index d35641e..363f478 100644 --- a/energy-monitor/src/process.rs +++ b/energy-monitor/src/process.rs @@ -41,14 +41,15 @@ impl ProcessData { let elapsed = self.started_at.elapsed().as_secs_f64(); for (pid, (energy, tree_energy)) in energy_data { - let process_info = self.process_info.entry(pid).or_insert({ + let process_info = self.process_info.entry(pid).or_insert_with(|| { let name = get_process_name(pid).unwrap_or_else(|| format!("Process {}", pid)); - ProcessInfo::new(pid, name) + ProcessInfo::new(pid, name, energy, tree_energy) }); let process_delta = energy - process_info.energy; let delta = tree_energy - process_info.tree_energy; + let delta = (process_info.history.last().map(|x| x.1).unwrap_or(delta) + delta) * 0.5; process_info.energy = energy; process_info.tree_energy = tree_energy; process_info.add_history_point(elapsed, delta); @@ -64,15 +65,35 @@ impl ProcessData { .partial_cmp(&self.process_info[a].energy) .unwrap() }); + let mut sorted_processes = updated_processes.clone(); // Update our local process list self.processes = updated_processes; + sorted_processes.sort_unstable(); // TODO: garbage collect process_info + self.process_info + .retain(|pid, _| sorted_processes.binary_search(pid).is_ok()); // Add total energy to history let elapsed = self.started_at.elapsed().as_secs_f64(); - self.add_total_energy_point(elapsed, total_energy); + let total_energy = (total_energy + + self + .total_energy_history + .last() + .map(|(_, x)| x) + .unwrap_or(&total_energy)) + * 0.5; + self.add_total_energy_point( + elapsed, + (total_energy + + self + .total_energy_history + .last() + .map(|(_, x)| x) + .unwrap_or(&total_energy)) + * 0.5, + ); } fn add_total_energy_point(&mut self, timestamp: f64, energy: f64) { diff --git a/energy-monitor/src/ui.rs b/energy-monitor/src/ui.rs index 276a3df..3a94e53 100644 --- a/energy-monitor/src/ui.rs +++ b/energy-monitor/src/ui.rs @@ -192,7 +192,7 @@ fn draw_detailed_view(f: &mut Frame, app: &mut App, area: Rect) { let dataset = Dataset::default() .name(process.name.clone()) - .marker(symbols::Marker::Braille) + .marker(symbols::Marker::Dot) .style( Style::default().fg(app .process_colors @@ -288,7 +288,7 @@ fn draw_energy_graph(f: &mut Frame, app: &mut App, area: Rect) { datasets.push( Dataset::default() .name("Total System Energy") - .marker(symbols::Marker::Braille) + .marker(symbols::Marker::HalfBlock) .style(Style::default().fg(Color::White)) .data(&app.process_data.total_energy_history), ); @@ -301,7 +301,7 @@ fn draw_energy_graph(f: &mut Frame, app: &mut App, area: Rect) { datasets.push( Dataset::default() .name(process.name.clone()) - .marker(symbols::Marker::Braille) + .marker(symbols::Marker::Dot) .style( Style::default().fg(app .process_colors |