什么样的任务被认为是CPU密集型任务?就算是对于...例如算法/代码(不太是视频编辑等用例)。原因是似乎不使用NodeJS的主要原因是CPU密集型任务,这是我非常喜欢它的东西。那么,什么被认为是CPU密集型任务呢?例如排序、搜索、图遍历、矩阵乘法等?
什么样的任务被认为是CPU密集型任务?就算是对于...例如算法/代码(不太是视频编辑等用例)。原因是似乎不使用NodeJS的主要原因是CPU密集型任务,这是我非常喜欢它的东西。那么,什么被认为是CPU密集型任务呢?例如排序、搜索、图遍历、矩阵乘法等?
“密集型”或“昂贵”的术语是相对的,不总是明显哪些活动是CPU密集型的。一般来说,除了I/O之外的任何事物都是CPU密集型的。而在node.js中,I/O是异步的,所以不会成为问题。因此,我们只剩下除了I/O之外的所有操作都是昂贵的。
选择通用模式的方法是明智的。 排序、搜索,甚至是算法本身都是CPU限制的。 当然,您无法完全消除CPU使用率,但如果您可以使数据库进行排序而非应用程序代码,则可能会更好。
我也会留意大型循环。 一个没有触发任何异步事件的循环是瓶颈。当然,一个程序员无法完全避免循环。 如果您的循环很短,那么没有问题。 如果您发现一个循环运行10,000次,您可能需要考虑使用setTimeout,process.nextTick或单独的node进程来分解它。
10,000是任意选择的。 这取决于循环的功能。 您的结果可能会有所不同。
运行在计算机上的进程或任务需要各种资源,如CPU周期、内存、磁盘或网络,这些资源由操作系统管理,以便每个任务能够有效地执行(尽可能不等待资源)。
操作系统试图通过让多个进程同时使用资源来最大化资源利用率。如果一个进程请求大量特定的资源,它可能会阻塞(延迟)其执行。该进程在相应的资源方面被称为资源密集型。因此,“资源密集型”是一个相对术语。
排序、搜索、图遍历、矩阵乘法都是CPU操作,一个进程是否“CPU密集型”取决于它们的执行频率和数量。例如,“转码视频”或“压缩文件”非常耗费CPU资源,因为它们运行CPU操作比读写内存或磁盘更多。如果您打算进行这些操作,应该创建一个单独的子进程,以便它不会减慢单线程的节点进程,或者最好创建一个Node 集群。
http://hacktux.com/bash/script/efficient
我能想到的另一个例子是递归函数,或者是不断调用自身直到满足条件的函数。这些通常会占用大量的CPU资源。