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 的问题。

可能有几个原因

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 进程有足够的资源运行。

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

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!