在`循环`中使用Rust的错误会导致廉价的阻塞,但为什么呢?

jjp*_*jpe 6 rust

use std::io::ErrorKind;
use std::net::TcpStream;

fn main() {
    let address = "localhost:7000";

    loop {
        match TcpStream::connect(address.clone()) {
            Err(err) => { match err.kind() {
                ErrorKind::ConnectionRefused => { continue; },
                kind => panic!("Error occurred: {:?}", kind),
            }; },
            Ok(_stream) => { /* do some stuff here */ },
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

考虑上面的Rust代码.这里有趣的不是Ok分支,而是与ErrorKind::ConnectionRefused子分支相结合loop:它非常便宜,CPU方面,CPU消耗不到1%.这很棒,这就是我想要的.

但我不明白为什么它很便宜:C中的可比代码可能会消耗100%基本上NOP(不精确但足够接近).任何人都可以帮助我理解为什么这么便宜?

der*_*ser 1

connect() 很可能是罪魁祸首;为了接收连接拒绝错误,它首先需要查找地址(对于本地主机来说应该很便宜),然后连接,并等待连接拒绝响应。

虽然与远程网络服务相比,本地主机确实相当快,但仍然存在大量开销。

对我来说ping localhost的延迟约为 0.9 毫秒。这意味着您的循环每秒仅执行 1000 到 10000 次迭代,这与实际的while true {}循环相比并不算多。