32

你认为什么是 CPU 密集型任务。就...而言,例如算法/代码(与其说是视频编辑等用例)。原因似乎是不使用 NodeJS 的主要原因是我真正喜欢的东西主要是 CPU 密集型任务。那算什么?是排序、搜索、图形横向、矩阵乘法吗?

4

3 回答 3

32

诸如“密集”或“昂贵”之类的术语是相对的,并不总是很明显哪些活动是 CPU 密集型的。一般来说,任何不是 I/O 的东西都是 CPU。在 node.js 中 I/O 是异步的,所以不是问题。因此,除了 I/O 昂贵之外,我们剩下的一切都是如此。

您选择一般模式的方法是明智的。排序、搜索,甚至一般的算法都受 CPU 限制。当然,你无法消除 CPU 使用率,但如果你可以让你的数据库排序而不是你的应用程序代码,你可能会更好。

我也会留意大循环。不触发任何异步事件的循环是瓶颈。当然,不能完全避免循环。它们是编程生活中的一个事实。如果你的循环很短,那么没问题。如果您发现一个循环运行 10,000 次,您可能需要考虑使用 setTimeout、process.nextTick 或单独的节点进程将其分解。

10,000 被任意挑选。这取决于循环的作用。您的里程可能会有所不同。

于 2013-03-11T15:28:54.127 回答
10

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

操作系统试图通过让多个进程同时使用资源来最大化资源利用率。如果一个进程大量请求特定资源,它可能会成为瓶颈(延迟)其执行。据说该过程对该资源来说是资源密集型的。因此,资源密集型是一个相对术语。

排序、搜索、图遍历、矩阵乘法都是 CPU 操作,一个进程是CPU-intensive不是取决于它们执行的多少和频率。例如trans-coding videoorcompressing files是相当 CPU 密集型的,因为它们运行 CPU 操作的次数远远超过读取/写入内存或磁盘所需的时间。如果你打算这样做,你应该为它创建一个单独的子进程,这样它就不会减慢单线程的节点进程,或者更好地创建一个节点集群

于 2013-03-11T16:44:35.710 回答
1

Bash 脚本确实涉及到这一点。我的教授总是喋喋不休地要求我们编写高效的代码来简化 CPU 上的工作

这是Linux中低效实践的一个很好的例子

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

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

于 2013-03-11T14:55:39.440 回答