由于购买计算能力比过去负担得起,算法知识和效率变得不那么重要了吗?显然,您要避免无限循环,因此,并非一切顺利。但是,如果您拥有更好的硬件,那么您会以某种方式拥有更差的软件吗?
由于购买计算能力比过去负担得起,算法知识和效率变得不那么重要了吗?显然,您要避免无限循环,因此,并非一切顺利。但是,如果您拥有更好的硬件,那么您会以某种方式拥有更差的软件吗?
Answers:
我非常喜欢《算法概论》一书中的示例,该示例说明了算法效率的重要性:
让我们比较两种排序算法:插入排序和合并排序。它们的复杂度分别为和O (n log n )= c 2 n lg n。通常,合并排序的常数因子较大,因此让我们假设c 1 < c 2。
为了回答您的问题,我们评估了运行插入排序算法的较快计算机(A)与运行合并排序算法的较慢计算机(B)的执行时间。
我们猜测:
因此,根据这些假设,
的计算机A至排序107号和
对于计算机B。
因此,速度要慢1000倍的计算机可以解决问题的速度快17倍。实际上,合并排序的优势将更加显着,并且随着问题的规模而增加。我希望这个例子有助于回答您的问题。
但是,这不仅仅涉及算法复杂性。今天,仅通过使用具有更高CPU频率的机器几乎不可能获得显着的加速。人们需要为可扩展的多核系统设计算法。这也是一项棘手的任务,因为随着内核数量的增加,开销(例如,用于管理内存访问)也随之增加。因此,几乎不可能获得线性加速。
综上所述,当今高效算法的设计与以前同样重要,因为与高效算法带来的频率提升相比,频率增加和额外内核都不会提高速度。
反之。在硬件价格越来越便宜的同时,还有其他一些发展。
首先,要处理的数据量呈指数增长。这导致了对准线性时间算法以及大数据区域的研究。例如,考虑一下搜索引擎-它们必须处理大量查询,处理大量数据并迅速进行处理。算法比以往任何时候都重要。
其次,机器学习领域正在变得越来越强大,并且充满了算法(尽管与您在BA中学到的算法不同)。这个领域正在蓬勃发展,每隔一段时间就会发明出一种真正新的算法,并显着提高性能。
第三,分布式算法变得越来越重要,因为我们在提高CPU处理速度方面遇到了障碍。如今,通过并行化来提高计算能力,其中涉及专用算法。
第四,为了平衡CPU不断增长的功能,现代编程范例采用虚拟机方法来解决安全漏洞。这使这些程序的速度明显降低。更令人困惑的是,您的操作系统正在花更多的时间在CPU上,而为您的实际程序留出更少的CPU时间,其中可能包括CPU密集型算法,例如视频压缩和解压缩。因此,尽管硬件速度更快,但使用效率却不高。
总结起来,高效的算法对于处理大量数据是必不可少的。人工智能领域出现了新的算法; 分布式算法成为人们关注的焦点;而且由于各种原因,CPU能力的利用效率较低(但主要是因为计算机变得越来越强大)。算法还没有死。
算法的知识远不止如何编写快速算法。
它还为您提供了解决问题的方法(例如,分而治之,动态编程,贪婪,归约,线性编程等),您可以在遇到新的挑战性问题时应用这些方法。拥有合适的方法通常会导致代码更简单,编写起来更快。因此,我不得不不同意Kevin的回答,因为没有精心组合的代码通常不仅速度慢而且很复杂。我喜欢David Parnas的话:
我经常听到开发人员被形容为“知道如何快速构建大型系统的人”。快速构建大型系统没有技巧。建立它们的速度越快,它们就会变得越大!
(当然,我们还需要将算法与软件设计方法结合起来编写好的代码。)
算法知识还告诉我们如何组织数据,以便您可以通过使用数据结构更轻松,更有效地处理它们。
此外,它为我们提供了一种估算方法效率的方法,并且可以了解几种不同方法之间在时间复杂度,空间复杂度和代码复杂度方面的取舍。知道这些权衡是在资源限制内做出正确决定的关键。
关于软件效率的重要性,我将引用维尔斯定律:
软件变得越来越慢,而硬件变得越来越快。
拉里·佩奇(Larry Page)最近重申,软件每18个月变慢一倍,因此超过了摩尔定律。
是的,它们在整个行业中的重要性相对而言要小一些。文本编辑器可能“足够快”,并且可能不需要太多改进。IT工作的大部分工作是确保用Java编写的组件A与用C编写的组件B可以通过用Cobol(或其他方式)编写的消息队列正确通信,或将产品推向市场等。
此外,架构变得复杂。当您使用普通的老式简单处理器时,每个周期只有1条指令,并且在汇编中编写时,优化是“容易的”(您只需要计算指令数)即可。当前,您没有简单的处理器,而是具有寄存器重命名和多级缓存的全管道,超标量,乱序的处理器。而且您不是用汇编语言编写的,而是用C / Java / etc编写的。在这里代码被编译/ JIT(通常是更好的代码,然后您或我会在汇编中编写),或者在Python / Ruby / ...中,代码被解释,并且您从计算机的多个抽象级别中分离出来。微优化很难实现,大多数程序员将获得相反的效果。
不,它们在研究和“绝对”意义上同样重要。在某些区域,速度非常重要,因为它们需要处理大量数据。在这种规模上,复杂性至关重要,如Pavel示例所示。
但是,还有其他情况-当速度很重要时(HPC,嵌入式设备等),仍然选择从算法“下降”。您会在许多大学团体中找到专门从事编译器和/或软件优化的团体。例如,简单地交换循环顺序就可以使速度提高一千倍,这仅仅是因为它有效地利用了高速缓存-虽然这可能是一个极端的例子,但CPU与内存的差距在过去30年中增长了1000倍。计算机体系结构也是CS的一部分。因此,许多计算速度的提高实际上是普通CS领域的一部分。
在工业方面-当您拥有HPC群集时,速度很重要,因为单个程序可以运行数天,数月或数年。不仅您需要支付电费,而且等待也可能会花费金钱。您可以扔掉两倍的硬件,但对于最大的公司来说,700M $几乎不能算是零花钱-在这种情况下,程序员是更便宜的选择,如果将程序重写为新语言仅意味着“小”的提速-他们可能考虑一下。
同样,速度可能意味着更好的用户体验。许多关于手机操作系统的评论都指出,哪一个是“更聪明”的,尽管可以通过“技巧”来完成,但这无疑是一个研究领域。另外,您还希望更快地访问数据并快速执行所需的操作。有时,这意味着您可以做更多的事情-在游戏中,您有0.017s的时间可以做所有事情,而速度越快,您就可以放得越多。
这是一个有趣的讨论。我们这里有几件事要看。
理论计算机科学-这是一门不断发展的科学,意味着随着时间的流逝,我们将找到解决问题的更好的新方法,这意味着改进了搜索和排序算法。
更大的社区/更大的库-因为其他人已经完成了很多工作,所以我们可以在他们的工作上继续工作,并使用他们已经创建甚至编码的算法。这些库将随着时间更新,使我们能够自动访问更高效的程序/算法。
发展-现在我们这里有一个问题。许多程序员不是计算机科学家,因此他们编写代码来解决业务问题,而不是技术/理论问题,并且会喜欢使用冒泡排序作为快速排序之类的方法。在这里,硬件的速度允许不良的程序员摆脱使用不良算法和不良编码实践的困境。内存,CPU速度,存储空间这些不再是主要问题,而且每隔几个月它们就会变得越来越大,越来越快,越来越便宜。我的意思是看看新手机。它们现在比1970年代/ 80年代的大型机/服务器要先进。更多存储空间,更多处理能力,更快内存。
UI和DATA-在大多数开发领域中,现在认为用户界面/用户体验和DATA比超高效代码更重要。因此,速度只有在用户不得不等待很长时间时才成为问题。如果我们为用户提供良好的外观和感觉,并且他从应用程序中获得了良好的响应,那么他会感到很高兴。而且,如果企业知道所有数据都已安全安全地存储,并且他们可以随时检索和操作它们,则无需理会它需要多少空间。
因此,我不得不说,并不是说高效的程序员不再重要或不再需要,而是很少有公司/用户会因为超高效的程序员而获得奖励,而由于硬件的改进,我们正在努力减少精简高效。但是,至少仍然有人关注效率,并且由于社区精神,每个人都可以从中受益。
关于这个有趣而深刻的问题的其他一些角度则强调了现象的跨学科和跨领域的方面。戴在回答中引用了沃思定律:
软件变得越来越慢,而硬件变得越来越快。
这个想法与经济学中观察到的现象有有趣的相似之处。请注意,经济学与计算机科学有着许多深厚的联系,例如在调度中,通过“负载平衡”算法根据需要分配稀缺资源(例如线程等)。另一个示例是所谓的生产者-消费者队列。此外,拍卖。
另外,例如,同名法律列表,维基百科:
帕金森定律 –“工作不断扩展,以填补完成工作所需的时间。” 由C. Northcote Parkinson(1909–1993)创造,他也提出了这样的推论:“支出增加以赚取收入。” 在计算机中:程序将展开以填充所有可用内存。
与杰文的悖论也有很强的相似之处,在效率更高的瓦特蒸汽发动机开始取代纽康门设计之后,能源使用量增加,但使用或扩散的发动机增加了:
在经济学中,Jevons悖论(有时称为Jevons效应)是这样一种命题,即提高资源使用效率的技术进步趋向于(而不是降低)该资源的消耗率。
打个比方,硬件就是资源,软件就像资源的消耗(又名供应与需求)。这样的软件和硬件(和在每个前进)稍微存在在紧密耦合共生反馈环路彼此,在某种意义上说,共同进化。有许多复杂且相互关联的因素会影响这种相互作用,例如:
不,主要是在考虑空间复杂性的同时!普通计算机的存储容量呈指数增长。