用于单核 Windows 7 机器的 Node.js 电子应用程序在文件 I/O 上很慢

Posted

技术标签:

【中文标题】用于单核 Windows 7 机器的 Node.js 电子应用程序在文件 I/O 上很慢【英文标题】:Node.js Electron Applications for Single Core Windows 7 machines are slow on file I/O 【发布时间】:2017-01-31 14:49:10 【问题描述】:

我在单核 Windows 7 机器上运行电子应用程序。似乎每当我使用 fs 库执行几乎任何文件 I/O 时,电子进程的 CPU 都会飙升至 ~100%,并且执行文件 I/O 可能需要长达一分钟的时间。

一个特别慢的函数是fs.readFileAsync()。我正在阅读的文件很小,但执行起来似乎需要很长时间。

我还在双核 Windows 7、Windows 8.1、Windows 10 和 Ubuntu 15.10 上运行了这个确切的代码,这些操作系统都没有遇到这个问题,它似乎只是单核 Windows 7 机器。 (所以我几乎可以肯定编写的代码没有问题)。

有谁知道为什么会发生这种情况?这个问题有什么解决办法吗?内核数量影响电子应用程序的性能似乎很奇怪。同样,这只是 Windows 7,因此单核 Windows 8.1 或 Windows 10 机器不会出现这种行为。

【问题讨论】:

我认为我们在单核 Windows Server 2012 R2 VM 上遇到了同样的问题,即 99% 的 cpu 峰值。我将在几天内将我们运行的所有 4 个实例更改为多核。希望它能解决我们 Electron 应用程序目前的蜗牛速度。 我可能在启动时看到了与 VS Code 类似的问题(基于 Electron)。在我的情况下,使用任务管理器将 Code.exe 进程的优先级降低到接近 100% 的 CPU 数小时以低于正常值立即“修复”问题并让 VS Code 启动。对另一个使用 CPU 更少的 Code.exe 进程执行相同操作没有任何效果。罪魁祸首似乎是最初的 Code.exe 进程。 【参考方案1】:

这让人想起this issue 和我见过的其他问题。

Electron 应用程序中的require("fs") 实际上并没有得到 Node 的 fs 模块。它使用 Electron 提供的另一个版本的fs。 Electron 团队的建议是在进行文件操作时使用require("original-fs")

有一个开放的issue 来记录这个:

Electron 直接修改 fs 模块以支持 ASAR 文件,这对于不需要 ASAR 支持的用例来说可能是性能负担,但是为了支持这些用例,“原始”fs 模块可在 require('original-fs') 下获得.

如果您遇到速度变慢,我会尝试使用 original-fs

【讨论】:

糟糕,单核似乎是这个问题的一个重要因素。在那种情况下我的答案可能不是正确的......【参考方案2】:

Electron 在主进程中不能很好地处理这样的任务。 Electron 也不是多线程的。

即使您运行的是单核,我还是建议您使用节点的“child_process”在电子的主进程之外运行文件读/写(或任何繁重的任务)。这应该可以解决应用程序中的任何奇怪的打嗝或卡顿,并且通常会加快速度。

还要记住,electron 是基于 chrome 的,node 是基于 v8 的,它是 chrome 的核心。这些东西结合起来使电子本质上非常资源密集,性能通常是电子的缺点。好处显然是能够快速创建跨平台应用程序。一台 1 核的机器整体上可能不太适合运行 1 个电子应用程序。我们还没有 1 核心机在什么? 10 年?

【讨论】:

以上是关于用于单核 Windows 7 机器的 Node.js 电子应用程序在文件 I/O 上很慢的主要内容,如果未能解决你的问题,请参考以下文章

用于 64 位 Windows 7 机器的 Microsoft ODBC 驱动程序的替代品(将 Excel 数据获取到 SQL)

如何在 Windows 7 机器上安装 gcc?

Java中的关键字volatile是不是强制单核机器上的内存同步?

为啥内存重新排序在单核/处理器机器上不是问题?

单核机器上的 CompletableFuture

Qt 4.8.4 Release 版本不适用于 Windows 7 64 位