Rust Reqwest比Postman和Firefox慢10倍

xghobddn  于 9个月前  发布在  Postman
关注(0)|答案(1)|浏览(116)

我在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。
知道是什么引起的吗

33qvvth1

33qvvth11#

实际上有很多因素导致了这个意想不到的结果。以下是我们的发现。

  • 您可以使用application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8, */*头(与NPM Registry Docs一样)来显著减少有效负载的大小,并使请求更快。你也可以做Content-Encoding: gzip,但是这是相当慢一点。
  • 可能有一些服务器端缓存涉及Firefox头,这可能是为什么它是如此之快,即使浏览器缓存关闭。当清除该高速缓存和cookie时,达到了预期的响应时间。
  • 这是可能的,因为我住在一个偏远地区,最近的配送中心是相当远,使我的响应时间有点慢
  • 如果可能的话,在应用程序中除了头文件之外使用GET·/{package}/{version}而不是GET·/{package}是一个更好的解决方案。

请注意,这些发现不是100%确定的,而是推测。我会更新这个答案,如果我找到更多的信息。编码愉快!

相关问题