假设我有一个下面的铁 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();
}

执行此代码需要数十秒.

同样,当我想要显示大量循环的进度条,而每个循环花费的时间很少时,似乎表明每一次循环都会更新终端上写入的进度条,开销变得很大.

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

(我知道使用std::time::{Duration, Instant}可以做到这一点,但我想知道更简单、更易读的解决方案(如果存在的话).)

推荐答案

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

过滤(每毫秒10个刻度)it constructs an Instant on every call to inc().而且建造它的速度很慢.

有比Instant::now()更快地获得当前时间的方法,但它们也更复杂.也许,前进的最佳途径是每隔N次才调用inc().

Rust相关问答推荐

捕获Rust因C++异常而产生panic

为什么我需要在这个代码示例中使用&

在Rust中,在实现特征`Display`时,如何获取调用方指定的格式?

如何导入crate-type=[";cdylib;]库?

避免在Collect()上进行涡鱼类型的涂抹,以产生<;Vec<;_>;,_>;

不能在一个代码分支中具有不变的自身borrow ,而在另一个代码分支中具有可变的self borrow

写入引用会更新基础值,但引用会打印意外的值

在Rust中克隆源自INTO_ITER()的迭代器的成本?

为什么 `Deref` 没有在 `Cell` 上实现?

在为第三方 struct 实现第三方特征时避免包装器的任何方法

类型生命周期绑定的目的是什么?

实现 Deref 的 struct 可以返回对外部数据的引用吗?

如何从宏调用闭包?

使用在功能标志后面导入的类型,即使未启用功能标志

在 Bevy 项目中为 TextureAtlas 精灵实施 NearestNeighbor 的正确方法是什么?

产生拥有值的迭代器的 Rust 可变borrow 在循环中失败

当 T 不是副本时,为什么取消引用 Box 不会抱怨移出共享引用?

字符串切片的向量超出范围但原始字符串仍然存在,为什么判断器说有错误?

我如何将特征作为 struct 的拥有字段?

在 Rust 中退出进程