From d0f88b179ccd769f51e012d183df7938272c6730 Mon Sep 17 00:00:00 2001 From: NotAShelf Date: Sun, 26 Jan 2025 01:06:02 +0300 Subject: [PATCH] further optimize uptime retrival MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Try and minimize expensive operations (e.g., divisions and allocations) to hopefully get a *consistent* measurable performance improvement. In my testing this brings the get_current function duration from > 1.2600 µs to < 1.2400 µs. --- src/uptime.rs | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/src/uptime.rs b/src/uptime.rs index 9a0d1f7..3a8c828 100644 --- a/src/uptime.rs +++ b/src/uptime.rs @@ -5,16 +5,29 @@ pub fn get_current() -> Result { let info = sysinfo().map_err(|e| io::Error::new(io::ErrorKind::Other, e))?; let uptime_seconds = info.uptime().as_secs(); - let total_minutes = uptime_seconds / 60; - let days = total_minutes / (60 * 24); - let hours = (total_minutes % (60 * 24)) / 60; - let minutes = total_minutes % 60; + let days = uptime_seconds / (60 * 60 * 24); + let hours = (uptime_seconds / 3600) % 24; + let minutes = (uptime_seconds / 60) % 60; - let parts = [(days, "day"), (hours, "hour"), (minutes, "minute")] - .iter() - .filter(|&&(value, _)| value > 0) - .map(|&(value, label)| format!("{value} {label}{}", if value > 1 { "s" } else { "" })) - .collect::>(); + let mut result = String::new(); + if days > 0 { + result.push_str(&format!("{days} day{}", if days > 1 { "s" } else { "" })); + } + if hours > 0 { + if !result.is_empty() { + result.push_str(", "); + } + result.push_str(&format!("{hours} hour{}", if hours > 1 { "s" } else { "" })); + } + if minutes > 0 { + if !result.is_empty() { + result.push_str(", "); + } + result.push_str(&format!( + "{minutes} minute{}", + if minutes > 1 { "s" } else { "" } + )); + } - Ok(parts.join(", ")) + Ok(result) }