feat: more frequently update.

This commit is contained in:
2025-12-22 04:57:32 +08:00
parent 63c5cceade
commit fe1f883b0d
3 changed files with 48 additions and 8 deletions

14
Cargo.lock generated
View File

@@ -220,9 +220,9 @@ checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695"
[[package]] [[package]]
name = "itoa" name = "itoa"
version = "1.0.15" version = "1.0.16"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" checksum = "7ee5b5339afb4c41626dde77b7a611bd4f2c202b897852b4bcf5d03eddc61010"
[[package]] [[package]]
name = "js-sys" name = "js-sys"
@@ -236,7 +236,7 @@ dependencies = [
[[package]] [[package]]
name = "l-s" name = "l-s"
version = "0.3.3" version = "0.3.4"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"clap", "clap",
@@ -295,9 +295,9 @@ checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"
[[package]] [[package]]
name = "portable-atomic" name = "portable-atomic"
version = "1.11.1" version = "1.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" checksum = "f59e70c4aef1e55797c2e8fd94a4f2a973fc972cfde0e0b05f683667b0cd39dd"
[[package]] [[package]]
name = "proc-macro2" name = "proc-macro2"
@@ -325,9 +325,9 @@ checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
[[package]] [[package]]
name = "ryu" name = "ryu"
version = "1.0.20" version = "1.0.21"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" checksum = "62049b2877bf12821e8f9ad256ee38fdc31db7387ec2d3b3f403024de2034aea"
[[package]] [[package]]
name = "serde" name = "serde"

View File

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

View File

@@ -13,6 +13,7 @@ pub struct ProgressTracker {
iops: Arc<AtomicU64>, iops: Arc<AtomicU64>,
start_time: Instant, start_time: Instant,
last_update: Arc<AtomicU64>, last_update: Arc<AtomicU64>,
last_bytes: Arc<AtomicU64>,
} }
impl ProgressTracker { impl ProgressTracker {
@@ -38,6 +39,7 @@ impl ProgressTracker {
iops: Arc::new(AtomicU64::new(0)), iops: Arc::new(AtomicU64::new(0)),
start_time: Instant::now(), start_time: Instant::now(),
last_update: Arc::new(AtomicU64::new(0)), last_update: Arc::new(AtomicU64::new(0)),
last_bytes: Arc::new(AtomicU64::new(0)),
} }
} }
@@ -81,10 +83,48 @@ impl ProgressTracker {
} }
/// 获取字节读取回调(可 move /// 获取字节读取回调(可 move
/// 在读取过程中定期更新消息,提供更高粒度的进度反馈
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();
let last_bytes = self.last_bytes.clone();
let last_update = self.last_update.clone();
let start_time = self.start_time;
let progress_bar = self.progress_bar.clone();
let bytes_read_clone = self.bytes_read.clone();
let iops = self.iops.clone();
move |bytes| { move |bytes| {
bytes_read.fetch_add(bytes, Ordering::Relaxed); bytes_read.fetch_add(bytes, Ordering::Relaxed);
// 每读取 16MB约4次缓冲区读取或每 200ms 更新一次消息,提供更细粒度的反馈
let total_bytes = bytes_read.load(Ordering::Relaxed);
let last_bytes_value = last_bytes.load(Ordering::Relaxed);
let now = start_time.elapsed().as_millis() as u64;
let last_update_value = last_update.load(Ordering::Relaxed);
// 检查是否需要更新:每 16MB缓冲区为4MB约4次读取或每 200ms
let bytes_diff = total_bytes.saturating_sub(last_bytes_value);
let time_diff = now.saturating_sub(last_update_value);
const UPDATE_BYTES_THRESHOLD: u64 = 16 * 1024 * 1024; // 16MB
const UPDATE_TIME_THRESHOLD: u64 = 200; // 200ms
if bytes_diff >= UPDATE_BYTES_THRESHOLD || time_diff >= UPDATE_TIME_THRESHOLD {
if let Some(pb) = &progress_bar {
let elapsed = start_time.elapsed().as_secs_f64();
let total_bytes = bytes_read_clone.load(Ordering::Relaxed);
let total_ops = iops.load(Ordering::Relaxed);
if total_bytes > 0 && elapsed > 0.0 {
let speed_bytes_per_sec = total_bytes as f64 / elapsed;
let speed_str = friendly_size(speed_bytes_per_sec as u64);
let iops_value = total_ops as f64 / elapsed;
pb.set_message(format!("IO速度: {}/s | IOPS: {:.0}", speed_str, iops_value));
}
}
last_bytes.store(total_bytes, Ordering::Relaxed);
last_update.store(now, Ordering::Relaxed);
}
} }
} }