【问题标题】:NodeJS on ARM takes 26 seconds to run an empty fileARM 上的 NodeJS 需要 26 秒才能运行一个空文件
【发布时间】:2020-12-02 16:50:01
【问题描述】:

NodeJS 在我的嵌入式系统上加载需要 26 秒。

我有一个来自 Microchip 的 SOM(模块上系统)。它是 ARM 架构,运行频率为 500MHz,内存为 128 MB。

它上面运行着一个安装了 NodeJS 的 Linux 的 BuildRoot 映像。

我有一个名为“index.js”的空文件。

当我运行“时间节点 index.js”时,需要 26 秒才能完成。 如果我编辑“index.js”以添加“console.log('hello');”,它需要 26 秒才能打印出消息。

因此,NodeJS 似乎需要 26 秒来加载并开始运行 JS 文件。

我运行了“strace 节点 index.js”。它调用 mprotect 和 cacheflush 几千次来降低大部分速度:

13:41:43 cacheflush(0x309228e0, 0x309228ec, 0) = 0
13:41:43 mprotect(0x30902000, 249856, PROT_READ|PROT_EXEC) = 0
13:41:43 mprotect(0x30902000, 249856, PROT_READ|PROT_WRITE) = 0
13:41:43 mprotect(0x30902000, 249856, PROT_READ|PROT_EXEC) = 0
13:41:43 mprotect(0x30902000, 249856, PROT_READ|PROT_WRITE) = 0

这似乎是在刷新指令和数据缓存,将一段内存标记为 RX,然后标记为 RW,然后返回 RX,最后再标记为 RW。我的猜测是它是将函数复制到 RAM,修改它,然后运行它。

但是使用“strace -c node index.js”表示这使用了大约 0.5 秒。我需要找到剩下的 25.5 秒。

我如何找到剩下的 25 秒?

【问题讨论】:

标签: node.js linux arm embedded


【解决方案1】:

我在以下位置找到了一个预编译包: https://nodejs.org/download/release/latest-v15.x/node-v15.3.0-linux-armv7l.tar.gz

现在执行一个空脚本需要 1.6 秒。

我可以运行一个脚本,打印出 NodeJS 的编译配置,以找出与此的区别: 节点 -e "console.log(process.config);"

接下来是找出不同之处并将它们合并到 BuildRoot 脚本中。

【讨论】:

    猜你喜欢
    • 2017-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-23
    • 2022-11-10
    • 2022-07-29
    • 1970-01-01
    相关资源
    最近更新 更多