
TS 封装了一个 class
使用 Cheerio 对 HTML 进行解析和 dom 渲染操作,无网络和磁盘操作。
单纯的内存对象处理,使用了一些正则匹配。
mac 开发环境 60 ~ 80ms 执行时间
打包 docker 之后,mac 无资源限制的情况下,执行同一个 HTML 用了 600+ms
docker 部署到服务器后,也是 600ms+, 裸机 debian ,centos 测试结果相差不大,考虑到机器差异。
有办法知道是哪的差异吗?这个性能差异有点大。
// 问题片段 async run(){ const startTime = new Date().getTime(); const cOnfig= await loadConfig(); const { body: { run } } = config; let data: any = {}; // dom 渲染 this.render(); // 解析 dom 数据 for (const [key, value] of Object.entries(run)) { data[key] = this.parse({item: value, parentElement: null, parentKey: 'run' }); } const endTime = new Date().getTime(); const execTimeMs = (endTime - startTime); return { exec_time_ms: execTimeMs, ...data }; } 1 zhhbstudio 2024-04-30 16:21:35 +08:00 你在 mac 环境试一下打包后的大概多长时间啊 nodejs 适配各个系统我记得是通过底层的 libuv 实现的,虽然有差异,但不至于这么大差异 |
2 sead OP @zhhbstudio 感谢回复,我刚测试完 mac 下的运行,不知道打包后有这么大的差异。。 有办法让打包的变快吗? 难道产品模式用 npm run dev ?这就有点懵逼了 |
3 cheneydog 2024-04-30 16:44:57 +08:00 看你描述好像是 docker 的问题,不是 mac 的问题。 |
5 rbe 2024-04-30 16:49:49 +08:00 可能有几个原因 1. 你用的 ts ,开发环境可能用的 ts-node 跑的,打包运行时是编译成特定的版本 (参考 tsconfig.json 中的 target ),可能目标版本太低会有一些 polyfill 的操作影响性能 2. 开发环境你用的 node 版本可能和 docker 打包时 base image 的 node 版本不一样,也可能影响性能 需要把开发环境和实际服务器环境对齐一下再排查原因 |
6 sead OP @rbe 不是版本问题,开发时用的 npm run dev . ( nextjs ) mac build 之后运行 node .next/standalone/server.js ,打包后变慢了,跟 docker 和系统没有关系。 打包优化时由简变繁。。 |
7 zhhbstudio 2024-04-30 17:35:11 +08:00 加混淆了? @sead |
8 sead OP @zhhbstudio 没有做特殊处理,创建 nextjs 时配置也没怎么动,这个还是刚入门,都没研究过 { "compilerOptions": { "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, "skipLibCheck": true, "strict": true, "noEmit": true, "esModuleInterop": true, "module": "esnext", "moduleResolution": "bundler", "resolveJsonModule": true, "isolatedModules": true, "jsx": "preserve", "incremental": true, "plugins": [ { "name": "next" } ], "paths": { "@/*": ["./*"] } }, "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], "exclude": ["node_modules"] } |
9 sead OP |
10 foolishcrab 2024-04-30 19:08:23 +08:00 via iPhone 你用的 next 是不是开了 turbopack ,这个会有很多小问题。 想绕过去的话你可以搜下 nextjs externalize package |
11 sead OP @foolishcrab 好的,我去看下相关资料,创建后没专门去改配置。 这个问题还比较奇怪,像是打包时给逻辑给复杂化了,导致性能下降 /** @type {import('next').NextConfig} */ const nextCOnfig= { output: 'standalone', }; export default nextConfig; |
12 lisongeee 2024-05-01 16:52:35 +08:00 试试输出 this.render() 前后的耗时呢?感觉也可能是 loadConfig 的问题 |