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

2023-09-03 13:46:53 +08:00
 V2SD

问题描述

假设:

  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 的缓存配置可以起到作用吗
2525 次点击
所在节点    Node.js
11 条回复
BeautifulSoap
2023-09-03 13:50:46 +08:00
keep alive 吧,chrome 多次请求就自动帮你处理了。nodejs 运行完脚本就停掉了所以打开的端口直接关了需要重开
hronro
2023-09-03 13:59:17 +08:00
听说 node.js 内置的 http 模块很拉, 在 node.js 里用 shell 去调用 CURL 发请求都比用内置的 http 模块快(听别人说的, 没实际验证过)
isbase
2023-09-03 14:05:53 +08:00
用 urllib 试试
L1shen
2023-09-03 14:08:32 +08:00
觉得内置的 http 慢可以试试 uWebSockets.js
sub166
2023-09-03 16:12:21 +08:00
换成 deno 或者 bun 试试
zsj1029
2023-09-03 19:38:55 +08:00
进程开销,如果是 koa 常驻内存再试,应该可以稳定
MrKrabs
2023-09-03 19:58:35 +08:00
盲猜 tcp 连接延迟
githmb
2023-09-04 10:19:12 +08:00
有没有一种可能,浏览器的请求复用了一个 TCP 连接,你没发现你在 js 脚本里重复调用了几次只有第一次延迟有点高吗?
mark2025
2023-09-04 13:11:44 +08:00
1. nodejs 环境启动开销
2. http 握手开销
KiraMaple
2023-09-11 22:14:15 +08:00
@hronro 你看过 nodejs 的架构图就知道了,nodejs 本身调用 http 请求最后也是用 nodejs 内置的 curl 库,c++和 js 的交互应该不算频繁,而且 V8 在跨语言交互这块不算差
thynson
2023-09-15 09:54:05 +08:00
1. 浏览器的 keep-alive 机制优化掉了连接建立的开销
2. 浏览器默认会开启压缩,而 postman/node.js 默认没有压缩,如果 response body 较大,而且网速不够快的话,会有显著的区别
3. 如果你要测量一个接口的响应时间,最好在服务端测量,浏览器端的测量不可避免的会收到网络的影响

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/970512

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX