feat: speed up.

This commit is contained in:
2025-12-19 00:06:15 +08:00
parent b32cac8356
commit 77e134b832
3 changed files with 23 additions and 12 deletions

2
Cargo.lock generated
View File

@@ -236,7 +236,7 @@ dependencies = [
[[package]] [[package]]
name = "l-s" name = "l-s"
version = "0.3.1" version = "0.3.2"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"clap", "clap",

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "l-s" name = "l-s"
version = "0.3.1" version = "0.3.2"
authors = ["licsber <admin@licsber.site>"] authors = ["licsber <admin@licsber.site>"]
edition = "2021" edition = "2021"

View File

@@ -1,4 +1,5 @@
use std::sync::{Arc, Mutex}; use std::sync::atomic::{AtomicU64, Ordering};
use std::sync::Arc;
use std::time::Instant; use std::time::Instant;
use indicatif::{ProgressBar, ProgressStyle}; use indicatif::{ProgressBar, ProgressStyle};
@@ -8,9 +9,10 @@ use crate::utils::friendly_size;
/// 进度跟踪器,封装进度条和 IO 统计信息 /// 进度跟踪器,封装进度条和 IO 统计信息
pub struct ProgressTracker { pub struct ProgressTracker {
progress_bar: Option<ProgressBar>, progress_bar: Option<ProgressBar>,
bytes_read: Arc<Mutex<u64>>, bytes_read: Arc<AtomicU64>,
iops: Arc<Mutex<u64>>, iops: Arc<AtomicU64>,
start_time: Instant, start_time: Instant,
last_update: Arc<AtomicU64>,
} }
impl ProgressTracker { impl ProgressTracker {
@@ -32,9 +34,10 @@ impl ProgressTracker {
Self { Self {
progress_bar, progress_bar,
bytes_read: Arc::new(Mutex::new(0u64)), bytes_read: Arc::new(AtomicU64::new(0)),
iops: Arc::new(Mutex::new(0u64)), iops: Arc::new(AtomicU64::new(0)),
start_time: Instant::now(), start_time: Instant::now(),
last_update: Arc::new(AtomicU64::new(0)),
} }
} }
@@ -42,7 +45,15 @@ impl ProgressTracker {
pub fn finish_file(&self) { pub fn finish_file(&self) {
if let Some(pb) = &self.progress_bar { if let Some(pb) = &self.progress_bar {
pb.inc(1); pb.inc(1);
self.update_message(); // 每 10 个文件或每 0.5 秒更新一次消息,减少开销
let files_processed = pb.position();
let now = self.start_time.elapsed().as_millis() as u64;
let last_update = self.last_update.load(Ordering::Relaxed);
if files_processed % 10 == 0 || now.saturating_sub(last_update) > 500 {
self.update_message();
self.last_update.store(now, Ordering::Relaxed);
}
} }
} }
@@ -50,8 +61,8 @@ impl ProgressTracker {
fn update_message(&self) { fn update_message(&self) {
if let Some(pb) = &self.progress_bar { if let Some(pb) = &self.progress_bar {
let elapsed = self.start_time.elapsed().as_secs_f64(); let elapsed = self.start_time.elapsed().as_secs_f64();
let total_bytes = *self.bytes_read.lock().unwrap(); let total_bytes = self.bytes_read.load(Ordering::Relaxed);
let total_ops = *self.iops.lock().unwrap(); let total_ops = self.iops.load(Ordering::Relaxed);
if total_bytes > 0 && elapsed > 0.0 { if total_bytes > 0 && elapsed > 0.0 {
let speed_bytes_per_sec = total_bytes as f64 / elapsed; let speed_bytes_per_sec = total_bytes as f64 / elapsed;
@@ -73,7 +84,7 @@ impl ProgressTracker {
pub fn bytes_callback(&self) -> impl FnMut(u64) { pub fn bytes_callback(&self) -> impl FnMut(u64) {
let bytes_read = self.bytes_read.clone(); let bytes_read = self.bytes_read.clone();
move |bytes| { move |bytes| {
*bytes_read.lock().unwrap() += bytes; bytes_read.fetch_add(bytes, Ordering::Relaxed);
} }
} }
@@ -81,7 +92,7 @@ impl ProgressTracker {
pub fn iop_callback(&self) -> impl FnMut() { pub fn iop_callback(&self) -> impl FnMut() {
let iops = self.iops.clone(); let iops = self.iops.clone();
move || { move || {
*iops.lock().unwrap() += 1; iops.fetch_add(1, Ordering::Relaxed);
} }
} }
} }