rust - 为什么 TCP 回显服务器的异步版本使用的内存是同步版本的 50 倍?
问题描述
我有一个使用标准库的简单 TCP 回显服务器:
use std::net::TcpListener;
fn main() {
let listener = TcpListener::bind("localhost:4321").unwrap();
loop {
let (conn, _addr) = listener.accept().unwrap();
std::io::copy(&mut &conn, &mut &conn).unwrap();
}
}
它使用大约 11 MB 的内存:
东京
如果我将其转换为使用 tokio:
tokio = { version = "0.2.22", features = ["full"] }
use tokio::net::TcpListener;
#[tokio::main]
async fn main() {
let mut listener = TcpListener::bind("localhost:4321").await.unwrap();
loop {
let (mut conn, _addr) = listener.accept().await.unwrap();
let (read, write) = &mut conn.split();
tokio::io::copy(read, write).await.unwrap();
}
}
它使用 607 MB 内存:
async_std
同样,使用 async_std:
async-std = "1.6.2"
use async_std::net::TcpListener;
fn main() {
async_std::task::block_on(async {
let listener = TcpListener::bind("localhost:4321").await.unwrap();
loop {
let (conn, _addr) = listener.accept().await.unwrap();
async_std::io::copy(&mut &conn, &mut &conn).await.unwrap();
}
});
}
它还使用 607 MB 内存:
为什么程序的异步版本使用的内存是同步版本的 55 倍?
解决方案
你应该看看RES
专栏。一个使用 1.0MB,另一个使用 1.6MB。
其中大部分可能是启动 tokio 运行时和为其创建线程池所需的持续开销。
推荐阅读
- mysql - SQL:聚合超过聚合(最大超过总和)
- javascript - 检查在while循环React Native中是否仍然单击TouchableOpacity
- c - 将句子拆分为单词并将它们存储在链表中
- java - Bukkit / Spigot MC (Java) 中是否有一个实现的功能可以让我让玩家 ping 服务器?
- python - 在自定义模型上使用 keras 显示激活图
- maya - Maya Python:userSetup.py 在没有 evalDeferred 的情况下不执行?
- c# - Postman Http Post Request - 如何在正文中发送一个字符串
- javascript - 有没有办法以编程方式获取所有全局 HTML 属性的列表?
- bash - 如何在目录中搜索文件,然后使用 ffmpeg 将该目录的名称刻录到里面的文件中?
- docker - 为什么我会 CrashLoopBackOff