nodejs 碰到了个奇葩问题, mac 执行快,非 mac 下执行慢

查看 74|回复 8
作者:sead   
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
    };
  }
zhhbstudio   
你在 mac 环境试一下打包后的大概多长时间啊
nodejs 适配各个系统我记得是通过底层的 libuv 实现的,虽然有差异,但不至于这么大差异
sead
OP
  
@zhhbstudio 感谢回复,我刚测试完 mac 下的运行,不知道打包后有这么大的差异。。 有办法让打包的变快吗?
难道产品模式用 npm run dev ?这就有点懵逼了
cheneydog   
看你描述好像是 docker 的问题,不是 mac 的问题。
cheneydog   
@cheneydog #3 看错了
rbe   
可能有几个原因
1. 你用的 ts ,开发环境可能用的 ts-node 跑的,打包运行时是编译成特定的版本 (参考 tsconfig.json 中的 target ),可能目标版本太低会有一些 polyfill 的操作影响性能
2. 开发环境你用的 node 版本可能和 docker 打包时 base image 的 node 版本不一样,也可能影响性能
需要把开发环境和实际服务器环境对齐一下再排查原因
sead
OP
  
@rbe 不是版本问题,开发时用的 npm run dev . ( nextjs )
mac build 之后运行 node .next/standalone/server.js ,打包后变慢了,跟 docker 和系统没有关系。
打包优化时由简变繁。。
zhhbstudio   
加混淆了?
@sead
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"]
}
您需要登录后才可以回帖 登录 | 立即注册

返回顶部