javascript - CPU 密集型和 I/O 密集型有什么区别?

标签 javascript node.js performance cpu

CPU intensive 和有什么区别和 I/O intensive ?

为什么 node js 不是 CPU 密集型的?

最佳答案

CPU 密集型是使用大量 CPU 周期的代码。例如,加密/解密或视频转码将是 CPU 的繁重负载。
I/O 密集型是使用大量 I/O(通常是网络或磁盘)的代码,这些操作大多卸载到操作系统,并且与使用大量 CPU 相比更多地涉及与外部硬件的接口(interface)。
通常说 nodejs 特别擅长 I/O 密集型代码,因为它是非阻塞的 I/O 架构。它可以非常有效地同时进行大量 I/O 操作(比通常为每个 I/O 操作使用单独线程的架构更有效)。
一般来说,nodejs在一个线程中运行你的Javascript,因此只使用一个核心,所以它不擅长做一堆需要大量CPU的事情,因为它通常不会占用一个以上的CPU核心,所以CPU - 密集型操作不会并行运行,而是一个接一个地序列化。
此外,由于运行 Javascript 的单线程特性和事件驱动架构,当解释器运行 CPU 密集型操作时,它不能做任何其他事情。其他事情(例如到达您的服务器的新网络请求)必须等到 CPU 密集型代码完成。 Javascript 的多个线程之间没有时间片来平衡调度。
因此,这种非常高效的非阻塞 I/O 架构与 Javascript 的单线程运行相结合,创造了这样一种观念,即 nodejs 擅长大量 I/O,而不擅长需要大量 CPU 的操作。
现在,有一些方法可以解决需要大量 CPU 的操作。较新版本的 nodejs 有 Worker Threads因此,您现在可以启动尽可能多的有用线程,并通过将 CPU 密集型代码移出主线程来提高运行 CPU 密集型代码的整体性能,使其保持自由运行事件循环。而且,您可以使用工作线程让更多 CPU 内核参与 CPU 密集型工作。
例如,如果您有一个应用程序进行了大量加密,您可能会启动一个小工作线程池,然后创建一个加密工作队列。当主 JS 线程想要进行一些加密时,它会向加密队列提交一个作业,并且池中的一个工作线程将处理加密作业。它将有一个非阻塞的异步接口(interface),因此主线程不会被阻塞并且可以自由地做其他事情(比如服务其他请求),当工作线程完成时,它会向主线程发送一条消息线程将得到通知,然后可以访问加密结果而不会阻塞主 JS 线程。
您还可以使用内置集群模块让多个 CPU 参与处理传入的工作(无论是 CPU 密集型还是网络密集型)。

关于javascript - CPU 密集型和 I/O 密集型有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60595131/

相关文章:

javascript - 如何在使用路径别名导入的文件上使用 Babel?

javascript - Node.js:无法使用 Expect 测试输入

perl - 如何在实际负载下重播从日志到配置文件/基准Web应用程序到Web服务器的流量?

performance - cython 中的动态数组创建

javascript - 自定义 parsley.js 以在违规字段附近显示图标

javascript - 添加到节点的禁用选项无法与 vuetify 一起使用

javascript - Highchart网络图和面积图冲突

javascript - 手动输入时会复制值,但单击时不会自动复制

node.js - 有没有一种方法可以使用 Electron 日志在Electron应用程序中的console.log中记录所有内容?

jquery - 使用 IIS 静态内容服务与从 SQL Server Jquery WCF 获取数据之间的性能差异