如果使用 eprint 打印,计数器仅以 10Hz 显示!标准错误与打印!到标准输出

Counter only displays at 10Hz if it's printed with eprint! to stderr vs. print! to stdout

我写了一个程序来简单地增加一个计数器并在终端上显示它window:

use std::thread;
use std::time;

fn main() {
    let mut bun: u64 = 0;

    loop {
        print!("\r{}", bun);

        bun += 1;

        thread::sleep(time::Duration::from_millis(100));
    }
}

我认为这非常简单(期望看到计数器以每秒约 10 次的速度递增)但每次我编译 运行 它时,我得到的是以下内容:

我很清楚计数器正在正确递增,但是 print!宏每 28 秒左右才被调用(或工作)一次。

凭直觉,我尝试用 eprint! 代替 print!,这最终完全按照我最初 would/did 的预期工作(即终端显示计数器每秒递增 10 次).

然后,我不明白的是为什么这对一个而不是另一个有效(我的印象是打印到 io::stderr 和 io::stdout 基本上是使用终端时相同 window)。它们之间是否存在我没​​有掌握的细微差别?我的代码中是否还有其他原因导致我没有看到?我用 Google 搜索了一下,但似乎没有找到任何与此问题具体相关的内容。

我正在使用:

来自docs for print

Note that stdout is frequently line-buffered by default so it may be necessary to use io::stdout().flush() to ensure the output is emitted immediately.

使用 println,尾随的换行符会触发刷新,但对于这种情况,您需要显式刷新 stdout/stderr。

documentation for print! 中所述,标准输出是行缓冲的,这意味着更新不会在每次调用后传递到终端。标准错误似乎没有以相同的方式缓冲,因此您会立即得到更新。

要在标准输出上获得相同的行为,请在打印后添加对 std::io::stdout().flush() 的调用。

use std::io::Write;
use std::thread;
use std::time;

fn main() {
    let mut bun: u64 = 0;

    loop {
        print!("\r{}", bun);
        std::io::stdout().flush().unwrap();

        bun += 1;

        thread::sleep(time::Duration::from_millis(100));
    }
}