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(不精确但足够接近).任何人都可以帮助我理解为什么这么便宜?
connect() 很可能是罪魁祸首;为了接收连接拒绝错误,它首先需要查找地址(对于本地主机来说应该很便宜),然后连接,并等待连接拒绝响应。
虽然与远程网络服务相比,本地主机确实相当快,但仍然存在大量开销。
对我来说ping localhost的延迟约为 0.9 毫秒。这意味着您的循环每秒仅执行 1000 到 10000 次迭代,这与实际的while true {}循环相比并不算多。