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 - 正则表达式在文本编辑器中只匹配一次?

Javascript onclick 在单选按钮上不起作用

mysql - 从 sequelize 查询返回一个值

node.js - Mongoose .save() 不起作用

java - 为什么在 Java 9 G1 工作约 6 小时后性能会下降,而负载却没有实际增加?

performance - 如何验证我的LoadRunner测试脚本实际上正在执行?

javascript - 触发点击事件在IE10中不起作用

javascript - 使用 Express 从 Firebase 数据库获取数据

c - 超线程的最佳 gcc 优化开关

javascript - 如何在Javascript中设置Cookie的到期日期