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

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
};

}


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

14 回复

你在 mac 环境试一下打包后的大概多长时间啊

nodejs 适配各个系统我记得是通过底层的 libuv 实现的,虽然有差异,但不至于这么大差异


感谢回复,我刚测试完 mac 下的运行,不知道打包后有这么大的差异。。 有办法让打包的变快吗?
难道产品模式用 npm run dev ?这就有点懵逼了

看你描述好像是 docker 的问题,不是 mac 的问题。

#3 看错了

可能有几个原因

1. 你用的 ts ,开发环境可能用的 ts-node 跑的,打包运行时是编译成特定的版本 (参考 tsconfig.json 中的 target ),可能目标版本太低会有一些 polyfill 的操作影响性能
2. 开发环境你用的 node 版本可能和 docker 打包时 base image 的 node 版本不一样,也可能影响性能

需要把开发环境和实际服务器环境对齐一下再排查原因

不是版本问题,开发时用的 npm run dev . ( nextjs )

mac build 之后运行 node .next/standalone/server.js ,打包后变慢了,跟 docker 和系统没有关系。

打包优化时由简变繁。。

加混淆了?

没有做特殊处理,创建 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”]
}

请教下 target 应该怎么改? 还是真是难住了,尝试改配置也行不通。

实在不行就跑 dev 模式。。 要么就是换 jsdom 再试试,不过这打包还真是有点迷幻,比开发环境还慢。。

你用的 next 是不是开了 turbopack ,这个会有很多小问题。

想绕过去的话你可以搜下 nextjs externalize package

好的,我去看下相关资料,创建后没专门去改配置。

这个问题还比较奇怪,像是打包时给逻辑给复杂化了,导致性能下降

/** {import(‘next’).NextConfig} */
const nextConfig = {
output: ‘standalone’,
};

export default nextConfig;

试试输出 this.render() 前后的耗时呢?感觉也可能是 loadConfig 的问题



厉害!我自己都没注意到这里有一步 io 操作。。

本地调试快是读的文件, 部署后文件没有跟着打包,读 s3.

自己把自己搞进胡同了。。

遇到 Node.js 在不同操作系统上执行速度差异的问题,可能涉及多个因素,包括文件系统差异、系统资源分配、Node.js 版本和依赖库等。以下是一些可能的解决思路和代码示例:

  1. 检查 Node.js 版本: 确保在不同系统上使用相同版本的 Node.js。可以通过命令行 node -v 检查版本。

  2. 分析代码性能: 使用 Node.js 内置的性能分析工具 perf_hooks 来定位性能瓶颈。

    const { performance, PerformanceObserver } = require('perf_hooks');
    const obs = new PerformanceObserver((list, observer) => {
      console.log(list.getEntries()[0]);
      observer.disconnect();
    });
    obs.observe({ entryTypes: ['measure'], buffered: true });
    
    setTimeout(() => {
      performance.mark('A');
      // 替换为实际代码段
      setTimeout(() => {
        performance.mark('B');
        performance.measure('A to B', 'A', 'B');
      }, 1000);
    }, 1000);
    
  3. 文件系统差异: 如果代码中涉及大量文件操作,检查文件系统类型和性能。在 Linux 上,可以尝试使用 ext4xfs 等高性能文件系统。

  4. 依赖库: 确保所有依赖库在不同平台上表现一致。可以使用 npm ls 查看依赖树,并检查是否有平台特定的依赖。

  5. 系统资源: 检查非 Mac 系统上的 CPU、内存等资源使用情况,确保 Node.js 进程有足够的资源运行。

如果以上步骤无法解决问题,建议详细记录不同系统上的执行日志,并对比分析,以找到具体原因。

回到顶部