这几天很困扰我的一个 nodejs 脚本中的性能(?)问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2SD
V2EX    Node.js

这几天很困扰我的一个 nodejs 脚本中的性能(?)问题

  •  
  •   V2SD 2023-09-03 13:46:53 +08:00 3309 次点击
    这是一个创建于 816 天前的主题,其中的信息可能已经有所发展或是发生改变。

    问题描述

    假设:

    1. 这里有一个接口,在浏览器控制台中看到他的请求时间是 50ms
    2. 复制到同网络环境下的 postman 中调用,请求时间是将近 200ms ,请求头完全复制
    3. 把调用写到 js 脚本中,在同网络环境下 node 运行 ,console.time 显示也是 200ms

    怀疑过程

    1. 一开始以为是 nodejs 瓶颈,在中文互联网下搜索原因寥寥无几,改去 stackoverflow 用 [nodejs is slower than chrome] 查找,有几篇类似的像这一篇,看回答基本都是是归咎于网络;
    2. 通过 fiddler 查看,有如下区别 在这里插入图片描述
    3. 在 js 脚本中把原本一次运行只调用一次的请求重复调用了几次,发现后几次速度逐渐接近浏览器原生访问 在这里插入图片描述

    我的问题

    1. 我怀疑是不是有什么缓存机制在生效,与 fiddler 中的 TCP/IP Connect 和 ServerConnected 的差异相耦合,可惜到这里中文互联网上的资料就明显出现了欠缺,感觉我已经快找到正确的原因了,所以来找大家确认下
    2. 如果 1 是正确的,那对于每次运行都从头开始的 js 脚本,有什么解决方法吗? nginx 的缓存配置可以起到作用吗
    11 条回复    2023-09-15 09:54:05 +08:00
    BeautifulSoap
        1
    BeautifulSoap  
       2023-09-03 13:50:46 +08:00 via Android   3
    keep alive 吧,chrome 多次请求就自动帮你处理了。nodejs 运行完脚本就停掉了所以打开的端口直接关了需要重开
    hronro
        2
    hronro  
       2023-09-03 13:59:17 +08:00
    听说 node.js 内置的 http 模块很拉, 在 node.js 里用 shell 去调用 CURL 发请求都比用内置的 http 模块快(听别人说的, 没实际验证过)
    isbase
        3
    isbase  
    PRO
       2023-09-03 14:05:53 +08:00 via iPhone
    用 urllib 试试
    L1shen
        4
    div class="sep3"> L1shen  
       2023-09-03 14:08:32 +08:00
    觉得内置的 http 慢可以试试 uWebSockets.js
    sub166
        5
    sub166  
       2023-09-03 16:12:21 +08:00
    换成 deno 或者 bun 试试
    zsj1029
        6
    zsj1029  
       2023-09-03 19:38:55 +08:00 via iPhone
    进程开销,如果是 koa 常驻内存再试,应该可以稳定
    MrKrabs
        7
    MrKrabs  
       2023-09-03 19:58:35 +08:00
    盲猜 tcp 连接延迟
    githmb
        8
    githmb  
       2023-09-04 10:19:12 +08:00
    有没有一种可能,浏览器的请求复用了一个 TCP 连接,你没发现你在 js 脚本里重复调用了几次只有第一次延迟有点高吗?
    mark2025
        9
    mark2025  
       2023-09-04 13:11:44 +08:00
    1. nodejs 环境启动开销
    2. http 握手开销
    KiraMaple
        10
    KiraMaple  
       2023-09-11 22:14:15 +08:00
    @hronro 你看过 nodejs 的架构图就知道了,nodejs 本身调用 http 请求最后也是用 nodejs 内置的 curl 库,c++和 js 的交互应该不算频繁,而且 V8 在跨语言交互这块不算差
    thynson
        11
    thynson  
       2023-09-15 09:54:05 +08:00
    1. 浏览器的 keep-alive 机制优化掉了连接建立的开销
    2. 浏览器默认会开启压缩,而 postman/node.js 默认没有压缩,如果 response body 较大,而且网速不够快的话,会有显著的区别
    3. 如果你要测量一个接口的响应时间,最好在服务端测量,浏览器端的测量不可避免的会收到网络的影响
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2987 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 13:13 PVG 21:13 LAX 05:13 JFK 08:13
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86