diff options
author | Sebastian Thiel <sebastian.thiel@icloud.com> | 2023-05-05 12:31:41 +0200 |
---|---|---|
committer | Sebastian Thiel <sebastian.thiel@icloud.com> | 2023-05-05 12:34:47 +0200 |
commit | 13bfe4582f8cbf6f8f12e7ee8acaae710e8a87d2 (patch) | |
tree | aa09f454cd7e2fa4d3c1551c0ad5c7c3c94090b9 | |
parent | 565581fc11faf7512c27fe9095090f482a8d32f0 (diff) |
feat: TUI now shows performance metrics while scanning and after.
This is in preparation for the `moonwalk` upgrade.
-rw-r--r-- | src/interactive/widgets/footer.rs | 17 | ||||
-rw-r--r-- | src/interactive/widgets/main.rs | 4 | ||||
-rw-r--r-- | src/traverse.rs | 13 |
3 files changed, 31 insertions, 3 deletions
diff --git a/src/interactive/widgets/footer.rs b/src/interactive/widgets/footer.rs index 0414b76..453dc9a 100644 --- a/src/interactive/widgets/footer.rs +++ b/src/interactive/widgets/footer.rs @@ -14,6 +14,8 @@ pub struct Footer; pub struct FooterProps { pub total_bytes: Option<u128>, pub entries_traversed: u64, + pub traversal_start: std::time::Instant, + pub elapsed: Option<std::time::Duration>, pub format: ByteFormat, pub message: Option<String>, } @@ -23,18 +25,31 @@ impl Footer { let FooterProps { total_bytes, entries_traversed, + elapsed, + traversal_start, format, message, } = props.borrow(); let spans = vec![ Span::from(format!( - " Total disk usage: {} Entries: {} ", + " Total disk usage: {} Entries: {} {progress} ", match total_bytes { Some(b) => format!("{}", format.display(*b)), None => "-".to_owned(), }, entries_traversed, + progress = match elapsed { + Some(elapsed) => format!("in {:.02}s", elapsed.as_secs_f32()), + None => { + let elapsed = traversal_start.elapsed(); + format!( + "in {:.0}s ({:.0}/s)", + elapsed.as_secs_f32(), + *entries_traversed as f32 / elapsed.as_secs_f32() + ) + } + } )) .into(), message.as_ref().map(|m| { diff --git a/src/interactive/widgets/main.rs b/src/interactive/widgets/main.rs index 6d1a53a..2c9c903 100644 --- a/src/interactive/widgets/main.rs +++ b/src/interactive/widgets/main.rs @@ -42,6 +42,8 @@ impl MainWindow { tree, entries_traversed, total_bytes, + start, + elapsed, .. }, display, @@ -138,6 +140,8 @@ impl MainWindow { format: display.byte_format, entries_traversed: *entries_traversed, message: state.message.clone(), + traversal_start: *start, + elapsed: *elapsed, }, footer_area, buf, diff --git a/src/traverse.rs b/src/traverse.rs index d33eed1..7296274 100644 --- a/src/traverse.rs +++ b/src/traverse.rs @@ -22,7 +22,7 @@ pub struct EntryData { } /// The result of the previous filesystem traversal -#[derive(Default, Debug)] +#[derive(Debug)] pub struct Traversal { /// A tree representing the entire filestem traversal pub tree: Tree, @@ -30,6 +30,10 @@ pub struct Traversal { pub root_index: TreeIndex, /// Amount of files or directories we have seen during the filesystem traversal pub entries_traversed: u64, + /// The time at which the traversal started. + pub start: std::time::Instant, + /// The amount of time it took to finish the traversal. Set only once done. + pub elapsed: Option<std::time::Duration>, /// Total amount of IO errors encountered when traversing the filesystem pub io_errors: u64, /// Total amount of bytes seen during the traversal @@ -62,7 +66,11 @@ impl Traversal { Traversal { tree, root_index, - ..Default::default() + entries_traversed: 0, + start: std::time::Instant::now(), + elapsed: None, + io_errors: 0, + total_bytes: None, } }; @@ -201,6 +209,7 @@ impl Traversal { set_size_or_panic(&mut t.tree, t.root_index, root_size); t.total_bytes = Some(root_size); + t.elapsed = Some(t.start.elapsed()); Ok(Some(t)) } |