Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 电子一致性性能和旋转子Node.js进程_Javascript_Node.js_Performance_Electron_Electron Forge - Fatal编程技术网

Javascript 电子一致性性能和旋转子Node.js进程

Javascript 电子一致性性能和旋转子Node.js进程,javascript,node.js,performance,electron,electron-forge,Javascript,Node.js,Performance,Electron,Electron Forge,在我介绍一些背景知识之前,我想澄清一下,我并不是在寻找如何在Electron运行时下简单地生成一个新脚本作为渲染器进程,而是尝试使用普通节点运行时 所以我知道Electron在它的引擎盖下有一些不同的JS运行时风格,类似于NW.JS,我正在尝试为我的报告获得一致的性能结果 不幸的是,这似乎比我想象的要困难得多。我专门测试mailparser模块的速度,尽管这在这里并不重要 我首先在我们正在使用的Electron应用程序上运行它,它使用Electron Forge。我通过IPC调用了测试脚本,因为

在我介绍一些背景知识之前,我想澄清一下,我并不是在寻找如何在Electron运行时下简单地生成一个新脚本作为渲染器进程,而是尝试使用普通节点运行时

所以我知道Electron在它的引擎盖下有一些不同的JS运行时风格,类似于NW.JS,我正在尝试为我的报告获得一致的性能结果

不幸的是,这似乎比我想象的要困难得多。我专门测试
mailparser
模块的速度,尽管这在这里并不重要

  • 我首先在我们正在使用的Electron应用程序上运行它,它使用Electron Forge。我通过IPC调用了测试脚本,因为我们打算使用它,所以它是在
    ipcMain.handle
    的回调中调用的。在这里,性能非常差,我们的测试需要30-50秒才能完成

  • 然后我运行了一个测试脚本,在同一个Electron Forge应用程序中打开一个空白HTML文件,并在后台运行测试脚本。这在8-12秒时要好得多

  • 接下来,我用一个测试集、一个纯电子安装和一个
    mailparser
    安装设置了一个新目录。我没有在这里
    electron-rebuild
    ,但是
    mailparser
    确实依赖于
    node-iconv
    ,因此具有本机绑定

  • 我用Electron运行了一个测试脚本,只是调用了同一行代码。这并没有使用电子锻造。这里的表现在5-9秒时稍好一些

  • 然后,我运行了另一个测试脚本,这次只是使用普通的旧节点,这里的性能在1-3秒时非常出色

  • 所以我这里有两个问题:

  • 为什么在电子测试中性能变化如此之大?虽然我使用了IPCMain,但我使用了新的
    .handle
    ,它应该是异步的,并在Electron的节点运行时上下文中运行,因此它应该具有与在回调外部运行相同的性能。此外,Electron Forge和plain Electron测试也相差几秒钟,这对我来说毫无意义,因为我假设Electron Forge只是将电子二进制文件包在引擎盖下

  • 为了寻求最佳且一致的结果,我想知道如何在Electron中使用节点运行时来加速子进程。这样做通常只会启动一个新的渲染器进程,该进程正在运行Electron的(较慢的)JS运行时。我希望避免离开Electron Forge,但我能想到的唯一解决方案是将预编译的二进制文件与在为每个平台构建的节点运行时下运行的进程捆绑在一起


  • 对于问题1,如果不能够在代码中复制它,就很难知道问题是什么。你可以试着为Electron团队发布一个关于这个的帖子。他们更可能知道答案,但他们也要求代码

    话虽如此,启动一个子进程并不难,它只是运行node并将您从电子/电子锻造开销中解放出来。最简单的方法是使用node的命令,但告诉它使用主节点可执行文件而不是electron.exe。您只需交给它一个脚本即可运行,因此不必担心预编译的二进制文件

    在主进程上运行的以下代码(和)将在同一文件夹中运行名为server.js的脚本:

        const serverPath = path.join(__dirname, 'server.js');
        const { fork } = require('child_process');
        child = fork(serverPath, [],
            {
                execPath: "node",
                stdio: ['pipe', 'pipe', 'pipe', 'ipc']
            });
    
    如果这样做,则会得到一个启用IPC的子node.exe进程,而不是electron.exe进程。它可以通过IPC与主电子过程进行通信。它还可以使用从通常的package.json安装的任何npm模块,因为脚本可以与其他脚本位于同一文件夹中。因此,如果它起作用,这是一个相当干净的解决方案

    今天下午,我写了一些代码,以此来娱乐自己。它使用mailparser在中的node.exe进程中解析简单邮件

    就我所见,这也正确地打包了Electron Forge,包括正确的脚本。它不会打包节点本身,因此需要将其安装在目标计算机上,或者我认为您需要分发node.exe

    顺便说一句,目前还不完全清楚您是否真的尝试过这种方法,这是一种运行缓慢的场景。还有一些开销,因为我们正在设置IPC。如果它在您的用例中仍然运行缓慢,那么我认为可以使用node的spawn命令创建一个完全独立的进程