node.js - “Hello world”Rust 网络服务器从 Chrome 测量而不是从 curl 测量时比 Node 慢
问题描述
我创建了一个存储库,其中包含基于 Node.js和基于Rocket.rs 的Web 服务器。
考虑以下步骤:
- 通过以下方式启动 Rocket.rs 服务器
cargo run --release
- 通过以下方式启动 Node.js 服务器
node server.js
- 在 Chrome 中并排打开 http://localhost:8000/ (Rocket) 和 http://localhost:8090/ (Node)。
- 在开发者控制台打开的情况下,我不断刷新两个选项卡并观察到 Node 选项卡总是在 5 毫秒内完成,而 Rocket 选项卡有时需要超过 300 毫秒才能完成:
我在 actix-web 上也观察到了类似的事情,但程度较轻:在这种情况下,如果我没有刷新大约 5 秒的选项卡,我只会得到约 300 毫秒的延迟。如果我继续刷新它,那么请求会在 5 毫秒内完成。
有趣的是,如果我像this和this 这样通过 curl 进行测量,似乎不会发生延迟。两台服务器都有大约 4 毫秒的延迟。
我注意到 Rocket 和 actix-web 不会在响应中发送 Keep-Alive 标头。如果我理解正确的话,这对于 HTTP 1.1 请求应该无关紧要。
我正在使用安装了 Ubuntu 的 WSL 2。Chrome 在主机 Windows 中运行。
有人可以解释一下这里发生了什么吗?
更新:忘了提到我正在使用夜间编译器来构建火箭服务器(Rocket v0.4.6 似乎需要它)。直接从主分支更改为稳定并构建消除了延迟。但是,actix-web 延迟仍然有点令人担忧,因为我使用了稳定的编译器。
解决方案
全部从 windows 运行,在 node 中响应时间在 左右 2-4 ms
,在 rocket 中1-2 ms
。你的环境发生了一些奇怪的事情。
还尝试从 WSL 服务并获得相同的结果。
即使在 debug(rust) 上,它的平均花费+1ms
也比在发布时要多,这可能是一些奇怪的浏览器问题。
推荐阅读
- typeorm - 如何使用 TypeORM 引用具体继承
- visual-studio - 如何完成滚动的 12 个月
- facebook - 如何从 Facebook Marketing API 接收广告帐户/广告系列/广告组/广告历史记录?
- git - 如何以这种特定方式拆分 git commit
- math - 不同 word2vec 模型的主成分是否测量相同的东西?
- java - 需要从 Xml 获取值并在控制台上打印?
- celery - Celery Chains - 是否可以在链中的两个不同任务之间进行选择?
- javascript - 如何识别 Javascript 中的重新抛出错误?
- javascript - 将图像和视频传递到 WebWorker
- newrelic - 如何根据 SLA 得出 Apdex 阈值?