我在Rust中测试reqwest的性能,但不知何故,response.text().await
需要1-3秒才能完成。我已经测试了完全相同的网页与 Postman 和火狐,它只需要100- 300毫秒。我已经尝试了很多次,每一次Postman和Firefox都更快。
我试过使用Hyper以及.aggregate()
,也试过使用reqwest的.bytes()
和.chunk()
,它们都一样慢。有趣的是,.send().await
需要正常的100- 300毫秒,因为它应该。调用.content_length()
也非常高效。我也试过使用JavaScript的fetch()
和调用await response.json()
,但这肯定更快。
此外,这与发布版本无关,因为手动运行发布exe也很慢。Rust和reqwest也是最新的。
代码如下:
use std::time::Instant;
#[tokio::main]
async fn main() {
let client = reqwest::Client::new();
let response = client
.get("https://registry.npmjs.org/react")
.send()
.await
.unwrap();
let now = Instant::now();
let data = response.text().await;
let elapsed = now.elapsed();
println!("{}ms", elapsed.as_millis());
}
使用reqwest::blocking
也没有区别:
use std::time::Instant;
fn main() {
let now = Instant::now();
let data = reqwest::blocking::get("https://registry.npmjs.org/react")
.unwrap()
.text()
.unwrap();
let elapsed = now.elapsed();
println!("{}ms", elapsed.as_millis());
}
如果我请求一个数据较少的端点,请求所花费的时间确实会减少。例如,https://registry.npmjs.org/react/is-even使用reqwest需要300 ms,但使用Postman仍然需要70 ms。
知道是什么引起的吗
1条答案
按热度按时间33qvvth11#
实际上有很多因素导致了这个意想不到的结果。以下是我们的发现。
application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8, */*
头(与NPM Registry Docs一样)来显著减少有效负载的大小,并使请求更快。你也可以做Content-Encoding: gzip
,但是这是相当慢一点。GET·/{package}/{version}
而不是GET·/{package}
是一个更好的解决方案。请注意,这些发现不是100%确定的,而是推测。我会更新这个答案,如果我找到更多的信息。编码愉快!