什么算作 CPU 密集型任务(例如排序、搜索等?)[关闭]
Posted
技术标签:
【中文标题】什么算作 CPU 密集型任务(例如排序、搜索等?)[关闭]【英文标题】:What counts as CPU Intensive tasks (eg. sorting, searching etc?) [closed] 【发布时间】:2013-02-26 19:18:38 【问题描述】:您认为什么是 CPU 密集型任务。就......例如算法/代码而言(与其说是视频编辑等用例)。原因似乎是不使用 NodeJS 的主要原因是我真正喜欢的东西主要是 CPU 密集型任务。那算什么?是排序、搜索、图形横向、矩阵乘法吗?
【问题讨论】:
如果您说明您正在尝试执行的操作可能会占用大量 CPU,这可能会有所帮助。 相关:***.com/questions/868568/… 【参考方案1】:Bash 脚本确实涉及到这一点。我的教授总是喋喋不休地告诉我们如何编写高效的代码来减轻 CPU 上的工作
这是 Linux 中低效实践的一个很好的例子
http://hacktux.com/bash/script/efficient
我能想到的另一个例子是递归函数,或者是不断调用自身直到满足条件的函数。这些通常会占用大量 CPU 资源。
【讨论】:
很多这些建议实际上是为了可维护性/可移植性/可读性,而不是性能,例如使用内置的 echo、函数和数组。 链接已损坏。【参考方案2】:诸如“密集”或“昂贵”之类的术语是相对的,并不总是很明显哪些活动是 CPU 密集型的。一般来说,任何不是 I/O 的东西都是 CPU。在 node.js 中 I/O 是异步的,所以不是问题。因此,除了昂贵的 I/O 之外,我们剩下的一切都是如此。
您选择一般模式的方法是明智的。排序、搜索,甚至一般的算法都受 CPU 限制。当然,你无法消除 CPU 使用率,但如果你可以让你的数据库排序而不是你的应用程序代码,你可能会更好。
我也会留意大型循环。不触发任何异步事件的循环是瓶颈。当然,不能完全避免循环。它们是编程生活中的一个事实。如果你的循环很短,那么没问题。如果您发现一个循环运行 10,000 次,您可能需要考虑使用 setTimeout、process.nextTick 或单独的节点进程将其分解。
10,000 是任意挑选的。这取决于循环的作用。您的里程可能会有所不同。
【讨论】:
假设一个操作很昂贵。你会做什么来修复它?为 NodeJS 创建一个 C++ 扩展并让你的 JS 调用它?或者干脆把昂贵的工作放在一个工作线程中?或者是其他东西?也许只是用另一种语言创建应用程序? 就个人而言,我的第一个努力是让操作更快,因为所有其他选项都会增加复杂性。如果这是不可能的,我会考虑 setTimeout 如果我们正在查看只需要几秒钟的东西并且可能将它分成 2-4 个块。如果这还不够,我会尝试一个工作进程。作为最后的手段,我可能会考虑使用 C++ 扩展。 你可能想查看 webworker-threads 或类似的包npmjs.org/package/webworker-threads【参考方案3】:在计算机上运行的进程或任务需要由操作系统管理的各种资源,例如 CPU 周期、内存、磁盘或网络,以便每个任务高效执行(如果可能,无需等待资源)。
操作系统试图通过让多个进程最大化资源利用率 同时使用资源。如果一个进程请求一个特定的 大量资源,它可能会阻碍(延迟)其执行。这 据说该过程对于该资源来说是资源密集型的。所以 资源密集型是一个相对术语。
排序、搜索、图遍历、矩阵乘法都是CPU操作,一个进程是CPU-intensive
与否,取决于它们执行的多少和频率。例如trans-coding video
或compressing files
是相当CPU 密集型的,因为它们运行的CPU 操作远远超过它们读/写内存或磁盘所需的时间。如果你打算这样做,你应该为它创建一个单独的子进程,这样它就不会减慢单线程的节点进程,或者更好地创建一个node cluster。
【讨论】:
我可以使用工作线程,但如果他们需要等待很长时间才能完成它不会有多大帮助?所以我想知道,除了挂起的 UI(不难用工作线程修复)之外,做同样的计算是否比 Python/Ruby 慢? 这取决于两者的实现方式。 javascript 和 python 都是脚本语言。对于一般用途,JavaScript 比 Python 快(Python 在数字密集型情况下更好)。见这里quora.com/Programming-Languages/…。以上是关于什么算作 CPU 密集型任务(例如排序、搜索等?)[关闭]的主要内容,如果未能解决你的问题,请参考以下文章