在我提供一些背景知识之前,我想澄清一下,我不是在寻找如何在 Electron 运行时简单地生成一个新脚本作为渲染器进程,我正在尝试使用普通的 Node 运行时。
所以我知道 Electron 在它的引擎盖下有一些不同风格的 JS 运行时,类似于 NW.js,我正试图为我的报告获得一致的性能结果。
不幸的是,这似乎比我想象的要困难得多。我专门测试了mailparser
模块的速度,尽管这在这里并不重要。
我首先在使用 Electron Forge 的 Electron 应用程序上运行它。我通过 IPC 调用了测试脚本,因为这是我们打算使用的,所以它是在回调中调用的
ipcMain.handle
。在这里,性能真的很差,我们的测试需要 30-50 秒才能完成。然后我运行了一个测试脚本,它只在同一个 Electron Forge 应用程序中打开一个空白 HTML 文件,并在后台运行测试脚本。这在 8-12 秒时要好得多。
接下来,我设置了一个新目录,其中包含一个测试集、一个普通的 Electron 安装和一个mailparser
安装。我没有electron-rebuild
在这里,但mailparser
确实依赖于node-iconv
本机绑定,因此也有。
我用 Electron 运行了一个测试脚本,只调用了同一行代码。这没有使用 Electron Forge。这里的性能在 5-9 秒时稍好一些。
然后我运行了另一个测试脚本,这次只使用普通的旧节点,这里的性能在 1-3 秒时非常出色。
所以我在这里有两个问题:
为什么电子测试中的性能差异如此之大?虽然我使用了 IPCMain,但我使用了 new
.handle
,它应该是异步的,并且在 Electron 的节点运行时的上下文中运行,因此它应该具有与在回调之外运行相同的性能。此外,Electron Forge 和普通 Electron 测试也相差几秒钟,这对我来说毫无意义,因为我认为 Electron Forge 只会将 Electron 二进制文件包裹在引擎盖下。寻求最佳和一致的结果,我想知道如何使用 Electron 中的节点运行时启动子进程。这样做通常只会启动一个新的渲染器进程,该进程正在运行 Electron 的(较慢的)JS 运行时。我想避免离开 Electron Forge,但我能想到的唯一解决方案是将预编译的二进制文件与在为每个平台构建的 Node 运行时下运行的进程捆绑在一起。