V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ayang23
V2EX  ›  Rust

reqwest 的性能为啥这么差?

  •  
  •   ayang23 · 2022-11-09 08:45:18 +08:00 · 3170 次点击
    这是一个创建于 736 天前的主题,其中的信息可能已经有所发展或是发生改变。

    1. reqwest

    #[macro_use]
    extern crate timeit;
    
    fn main() -> Result<(), Box<dyn std::error::Error>> {
        timeit!({
            let _ = reqwest::blocking::get("http://localhost/")?
                .text()?;
        });
        Ok(())
    }
    

    2. chttp

    use chttp::prelude::*;
    
    #[macro_use]
    extern crate timeit;
    
    fn main() -> Result<(), Box<dyn std::error::Error>> {
        timeit!({
            let _ = chttp::get("http://localhost/")?
                .text()?;
        });
        Ok(())
    }
    

    3. python requests

    import requests
    %timeit requests.get('http://localhost/').text
    

    输出:

    1. reqwest 10 loops: 40.283526 ms

    2. chttp 1000 loops: 264.017153 µs

    3. requests 1.56 ms ± 27 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

    reqwest 换成 http1.0 协议也不变

    localhost 是本地 nginx

    这性能比 python requsts 都慢了几十倍,有点夸张

    10 条回复    2022-11-09 21:20:36 +08:00
    yuhangch
        1
    yuhangch  
       2022-11-09 08:49:37 +08:00
    因为 blocking ?
    ayang23
        2
    ayang23  
    OP
       2022-11-09 08:52:16 +08:00
    @yuhangch 按说都是从本地 nginx 返回的数据,速度很快的,我没测 async 的性能。如果是因为 blocking, 那可能就是 blocking 的设计有问题了
    ayang23
        3
    ayang23  
    OP
       2022-11-09 08:53:04 +08:00
    @ayang23 我再测一下 async
    ayang23
        4
    ayang23  
    OP
       2022-11-09 09:12:41 +08:00
    测了一下,结果和 blocking 一样
    @yuhangch
    RRyo
        5
    RRyo  
       2022-11-09 09:14:22 +08:00
    对比下 ureq?
    kuviki
        6
    kuviki  
       2022-11-09 09:14:30 +08:00   ❤️ 2
    可能初始化配置比较耗时?可以试下先在 timeit 外 Client::new() 再请求
    ayang23
        7
    ayang23  
    OP
       2022-11-09 09:19:03 +08:00
    @RRyo ureq 543.6769919999999 µs 也很快
    ayang23
        8
    ayang23  
    OP
       2022-11-09 09:22:15 +08:00
    @kuviki 你说的是对的
    移出去后只有 635.9667900000001 µs

    原来是这样啊
    DTCPSS
        9
    DTCPSS  
       2022-11-09 11:24:15 +08:00   ❤️ 1
    看文档,每次调用`reqwest::get()` 都会创建一个 Client ,这个方法只是为了一次性调用方便。要多次调用最好显式创建一个 Client 然后复用。
    ayang23
        10
    ayang23  
    OP
       2022-11-09 21:20:36 +08:00
    @DTCPSS 对,这个 Client 比较重
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1003 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 21:55 · PVG 05:55 · LAX 13:55 · JFK 16:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.