什么被视为CPU密集型任务(例如排序,搜索等)?

36

什么样的任务被认为是CPU密集型任务?就算是对于...例如算法/代码(不太是视频编辑等用例)。原因是似乎不使用NodeJS的主要原因是CPU密集型任务,这是我非常喜欢它的东西。那么,什么被认为是CPU密集型任务呢?例如排序、搜索、图遍历、矩阵乘法等?


如果您能详细说明您尝试做什么,而且认为这可能会占用大量 CPU 资源,那将非常有帮助。 - Hector Correa
相关:https://dev59.com/n3NA5IYBdhLWcg3wrf43 - Ciro Santilli OurBigBook.com
3个回答

37

“密集型”或“昂贵”的术语是相对的,不总是明显哪些活动是CPU密集型的。一般来说,除了I/O之外的任何事物都是CPU密集型的。而在node.js中,I/O是异步的,所以不会成为问题。因此,我们只剩下除了I/O之外的所有操作都是昂贵的。

选择通用模式的方法是明智的。 排序、搜索,甚至是算法本身都是CPU限制的。 当然,您无法完全消除CPU使用率,但如果您可以使数据库进行排序而非应用程序代码,则可能会更好。

我也会留意大型循环。 一个没有触发任何异步事件的循环是瓶颈。当然,一个程序员无法完全避免循环。 如果您的循环很短,那么没有问题。 如果您发现一个循环运行10,000次,您可能需要考虑使用setTimeout,process.nextTick或单独的node进程来分解它。

10,000是任意选择的。 这取决于循环的功能。 您的结果可能会有所不同。


1
假设某个操作很耗费资源,你会怎么解决?创建一个 C++ 扩展程序用于 NodeJS 并让 JS 调用它?或者将这个耗费资源的工作放在一个 Worker 线程中?还是其他方法?也许只需使用另一种语言创建应用程序? - Jiew Meng
2
就我个人而言,我的首要努力是使操作更快,因为所有其他选项都会增加复杂性。如果这不可能,我会考虑使用setTimeout,如果我们只需要几秒钟时间,那么可以把它分成2-4个块。如果这还不够,我会尝试使用工作进程。作为最后的选择,我可能会考虑使用C++扩展程序。 - Brandon
你可能想要查看 webworker-threads 或类似的软件包https://npmjs.org/package/webworker-threads - Brandon

12

运行在计算机上的进程或任务需要各种资源,如CPU周期、内存、磁盘或网络,这些资源由操作系统管理,以便每个任务能够有效地执行(尽可能不等待资源)。

 

操作系统试图通过让多个进程同时使用资源来最大化资源利用率。如果一个进程请求大量特定的资源,它可能会阻塞(延迟)其执行。该进程在相应的资源方面被称为资源密集型。因此,“资源密集型”是一个相对术语。

排序、搜索、图遍历、矩阵乘法都是CPU操作,一个进程是否“CPU密集型”取决于它们的执行频率和数量。例如,“转码视频”或“压缩文件”非常耗费CPU资源,因为它们运行CPU操作比读写内存或磁盘更多。如果您打算进行这些操作,应该创建一个单独的子进程,以便它不会减慢单线程的节点进程,或者最好创建一个Node 集群


我可以使用工作线程,但如果它们需要等待很长时间才能完成,那么这并没有太大帮助。所以我想知道,除了挂起的用户界面(使用工作线程不难解决),相比于Python/Ruby执行相同的计算,它是否更慢? - Jiew Meng
这取决于两者的实现方式。JavaScript和Python都是脚本语言。对于一般用途,JavaScript比Python更快(在数值密集型情况下,Python更好)。请参见此处http://www.quora.com/Programming-Languages/Is-JavaScript-v8-faster-than-Python。 - user568109

2
「Bash脚本编程真的涉及到这一点。我的教授总是强调我们要编写高效的代码,以减轻CPU的工作负担。」
「以下是Linux中低效实践的一个很好的例子。」

http://hacktux.com/bash/script/efficient

我能想到的另一个例子是递归函数,或者是不断调用自身直到满足条件的函数。这些通常会占用大量的CPU资源。


3
很多建议其实是为了提高可维护性、可移植性和可读性,而不是为了提高性能,比如使用内置的echo、函数和数组。 - Brandon
4
链接已失效。 - Michel Gokan Khan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接