V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sead
V2EX  ›  Node.js

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

  •  
  •   sead · 2024-04-30 16:12:41 +08:00 · 2296 次点击
    这是一个创建于 377 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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
        };
      }
    
    13 条回复    2024-05-01 17:57:59 +08:00
    zhhbstudio
        1
    zhhbstudio  
       2024-04-30 16:21:35 +08:00
    你在 mac 环境试一下打包后的大概多长时间啊

    nodejs 适配各个系统我记得是通过底层的 libuv 实现的,虽然有差异,但不至于这么大差异
    sead
        2
    sead  
    OP
       2024-04-30 16:34:35 +08:00
    @zhhbstudio 感谢回复,我刚测试完 mac 下的运行,不知道打包后有这么大的差异。。 有办法让打包的变快吗?
    难道产品模式用 npm run dev ?这就有点懵逼了
    cheneydog
        3
    cheneydog  
       2024-04-30 16:44:57 +08:00
    看你描述好像是 docker 的问题,不是 mac 的问题。
    cheneydog
        4
    cheneydog  
       2024-04-30 16:46:48 +08:00
    @cheneydog #3 看错了
    rbe
        5
    rbe  
       2024-04-30 16:49:49 +08:00
    可能有几个原因

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

    需要把开发环境和实际服务器环境对齐一下再排查原因
    sead
        6
    sead  
    OP
       2024-04-30 17:11:54 +08:00
    @rbe 不是版本问题,开发时用的 npm run dev . ( nextjs )

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

    打包优化时由简变繁。。
    zhhbstudio
        7
    zhhbstudio  
       2024-04-30 17:35:11 +08:00
    加混淆了?
    @sead
    sead
        8
    sead  
    OP
       2024-04-30 17:41:43 +08:00
    @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"]
    }
    sead
        9
    sead  
    OP
       2024-04-30 18:07:47 +08:00
    @rbe 请教下 target 应该怎么改? 还是真是难住了,尝试改配置也行不通。

    实在不行就跑 dev 模式。。 要么就是换 jsdom 再试试,不过这打包还真是有点迷幻,比开发环境还慢。。
    foolishcrab
        10
    foolishcrab  
       2024-04-30 19:08:23 +08:00 via iPhone
    你用的 next 是不是开了 turbopack ,这个会有很多小问题。

    想绕过去的话你可以搜下 nextjs externalize package
    sead
        11
    sead  
    OP
       2024-04-30 21:15:19 +08:00
    @foolishcrab 好的,我去看下相关资料,创建后没专门去改配置。

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

    /** @type {import('next').NextConfig} */
    const nextConfig = {
    output: 'standalone',
    };

    export default nextConfig;
    lisongeee
        12
    lisongeee  
       2024-05-01 16:52:35 +08:00
    试试输出 this.render() 前后的耗时呢?感觉也可能是 loadConfig 的问题
    sead
        13
    sead  
    OP
       2024-05-01 17:57:59 +08:00
    @lisongeee

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

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

    自己把自己搞进胡同了。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   941 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 21:40 · PVG 05:40 · LAX 14:40 · JFK 17:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.