如果使用 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 次的速度递增)但每次我编译 运行 它时,我得到的是以下内容:
- 约 28 秒内没有任何显示(只是一个带光标的空白行)
- 终端显示282,又是一个长延时
- 终端显示538,又延迟了
- 然后794等等等等
我很清楚计数器正在正确递增,但是 print!宏每 28 秒左右才被调用(或工作)一次。
凭直觉,我尝试用 eprint!
代替 print!
,这最终完全按照我最初 would/did 的预期工作(即终端显示计数器每秒递增 10 次).
然后,我不明白的是为什么这对一个而不是另一个有效(我的印象是打印到 io::stderr 和 io::stdout 基本上是使用终端时相同 window)。它们之间是否存在我没有掌握的细微差别?我的代码中是否还有其他原因导致我没有看到?我用 Google 搜索了一下,但似乎没有找到任何与此问题具体相关的内容。
我正在使用:
- Rust 版本 1.53.0
- Apple M1 on OS 11.4(假设这意味着我正在编译为 aarch64-apple-darwin)
- Compiling/running 使用
cargo run --release
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));
}
}
我写了一个程序来简单地增加一个计数器并在终端上显示它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 次的速度递增)但每次我编译 运行 它时,我得到的是以下内容:
- 约 28 秒内没有任何显示(只是一个带光标的空白行)
- 终端显示282,又是一个长延时
- 终端显示538,又延迟了
- 然后794等等等等
我很清楚计数器正在正确递增,但是 print!宏每 28 秒左右才被调用(或工作)一次。
凭直觉,我尝试用 eprint!
代替 print!
,这最终完全按照我最初 would/did 的预期工作(即终端显示计数器每秒递增 10 次).
然后,我不明白的是为什么这对一个而不是另一个有效(我的印象是打印到 io::stderr 和 io::stdout 基本上是使用终端时相同 window)。它们之间是否存在我没有掌握的细微差别?我的代码中是否还有其他原因导致我没有看到?我用 Google 搜索了一下,但似乎没有找到任何与此问题具体相关的内容。
我正在使用:
- Rust 版本 1.53.0
- Apple M1 on OS 11.4(假设这意味着我正在编译为 aarch64-apple-darwin)
- Compiling/running 使用
cargo run --release
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));
}
}