Skip to content

Commit d0f88b1

Browse files
committed
further optimize uptime retrival
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.
1 parent 592fb58 commit d0f88b1

File tree

1 file changed

+23
-10
lines changed

1 file changed

+23
-10
lines changed

src/uptime.rs

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,29 @@ pub fn get_current() -> Result<String, io::Error> {
55
let info = sysinfo().map_err(|e| io::Error::new(io::ErrorKind::Other, e))?;
66
let uptime_seconds = info.uptime().as_secs();
77

8-
let total_minutes = uptime_seconds / 60;
9-
let days = total_minutes / (60 * 24);
10-
let hours = (total_minutes % (60 * 24)) / 60;
11-
let minutes = total_minutes % 60;
8+
let days = uptime_seconds / (60 * 60 * 24);
9+
let hours = (uptime_seconds / 3600) % 24;
10+
let minutes = (uptime_seconds / 60) % 60;
1211

13-
let parts = [(days, "day"), (hours, "hour"), (minutes, "minute")]
14-
.iter()
15-
.filter(|&&(value, _)| value > 0)
16-
.map(|&(value, label)| format!("{value} {label}{}", if value > 1 { "s" } else { "" }))
17-
.collect::<Vec<_>>();
12+
let mut result = String::new();
13+
if days > 0 {
14+
result.push_str(&format!("{days} day{}", if days > 1 { "s" } else { "" }));
15+
}
16+
if hours > 0 {
17+
if !result.is_empty() {
18+
result.push_str(", ");
19+
}
20+
result.push_str(&format!("{hours} hour{}", if hours > 1 { "s" } else { "" }));
21+
}
22+
if minutes > 0 {
23+
if !result.is_empty() {
24+
result.push_str(", ");
25+
}
26+
result.push_str(&format!(
27+
"{minutes} minute{}",
28+
if minutes > 1 { "s" } else { "" }
29+
));
30+
}
1831

19-
Ok(parts.join(", "))
32+
Ok(result)
2033
}

0 commit comments

Comments
 (0)