减少 Rust 中指示进度条的开销

问题描述 投票:0回答:1

假设我有以下 Rust 代码:

use indicatif::ProgressBar;

fn main() {
    let limit = 100_000_000;

    let pb = ProgressBar::new(limit);
    for i in 0..limit {
        pb.inc(1);
    }

    pb.finish();
}

执行这段代码需要几十秒。

同样,当我想显示大量循环的进度条并且每个循环花费的时间很短时,似乎 indicatif 会在每次循环时更新写在终端上的进度条,并且开销变得很大。

有没有办法减少这种开销?比如每50毫秒更新一次进度条?

(我知道我可以使用

std::time::{Duration, Instant}
来做到这一点,但我想知道更简单且可读的解决方案(如果存在)。)

performance rust progress-bar
1个回答
0
投票

indicatif
实现了自己的过滤机制。但你的问题不在于写入,即使我们删除所有写入,你的代码仍然很慢。你的问题是过滤器本身。

过滤(每毫秒 10 个刻度) 它会在每次调用

Instant
 时构造一个 
inc()。而且构建速度很慢。

有比

Instant::now()
更快的方法来获取当前时间,但它们也更复杂。也许,最好的前进路径是仅每 N 次迭代调用
inc()

© www.soinside.com 2019 - 2024. All rights reserved.