perf: use lazy sorting when loading large directories to reduce unnecessary CPU consumption (#607)

This commit is contained in:
sxyazi 2024-02-01 18:43:59 +08:00
parent e6079438a0
commit 920afe29bd
No known key found for this signature in database
6 changed files with 30 additions and 7 deletions

View file

@ -4,13 +4,15 @@ use ratatui::layout::Rect;
use yazi_config::LAYOUT;
use yazi_shared::fs::{File, FilesOp, Url};
use super::FolderStage;
use crate::{folder::Files, manager::Manager, Step};
#[derive(Default)]
pub struct Folder {
pub cwd: Url,
pub mtime: Option<SystemTime>,
pub files: Files,
pub mtime: Option<SystemTime>,
pub stage: FolderStage,
pub offset: usize,
pub cursor: usize,
@ -31,8 +33,15 @@ impl Folder {
pub fn update(&mut self, op: FilesOp) -> bool {
let revision = self.files.revision;
match op {
FilesOp::Full(_, _, mtime) => self.mtime = mtime,
FilesOp::Done(_, mtime, ticket) if ticket == self.files.ticket() => self.mtime = mtime,
FilesOp::Full(_, _, mtime) => {
(self.mtime, self.stage) = (mtime, FolderStage::Loaded);
}
FilesOp::Part(_, _, ticket) if ticket == self.files.ticket() => {
self.stage = FolderStage::Loading;
}
FilesOp::Done(_, mtime, ticket) if ticket == self.files.ticket() => {
(self.mtime, self.stage) = (mtime, FolderStage::Loaded);
}
_ => {}
}

View file

@ -2,8 +2,10 @@ mod files;
mod filter;
mod folder;
mod sorter;
mod stage;
pub use files::*;
pub use filter::*;
pub use folder::*;
pub use sorter::*;
pub use stage::*;

View file

@ -0,0 +1,7 @@
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
pub enum FolderStage {
#[default]
Loading,
Loaded,
Failed,
}

View file

@ -4,7 +4,8 @@ use crate::manager::Manager;
impl Manager {
pub fn unyank(&mut self, _: Cmd) {
render!(!self.yanked.1.is_empty());
self.yanked = Default::default();
render!();
}
}

View file

@ -73,7 +73,7 @@ impl Preview {
};
let stream =
UnboundedReceiverStream::new(rx).chunks_timeout(10000, Duration::from_millis(350));
UnboundedReceiverStream::new(rx).chunks_timeout(50000, Duration::from_millis(500));
pin!(stream);
let ticket = FilesOp::prepare(&url);

View file

@ -5,7 +5,7 @@ use tokio::task::JoinHandle;
use yazi_shared::{fs::{File, Url}, render};
use super::{Backstack, Config, Finder, Mode, Preview};
use crate::folder::Folder;
use crate::folder::{Folder, FolderStage};
pub struct Tab {
pub mode: Mode,
@ -74,10 +74,14 @@ impl Tab {
pub fn apply_files_attrs(&mut self) {
let apply = |f: &mut Folder| {
let hovered = f.hovered().filter(|_| f.tracing).map(|h| h.url());
if f.stage == FolderStage::Loading {
return render!();
}
let hovered = f.hovered().filter(|_| f.tracing).map(|h| h.url());
f.files.set_show_hidden(self.conf.show_hidden);
f.files.set_sorter(self.conf.sorter());
render!(f.files.catchup_revision());
render!(f.repos(hovered));
};