算法(通常是效率)变得越来越不重要了吗?


29

由于购买计算能力比过去负担得起,算法知识和效率变得不那么重要了吗?显然,您要避免无限循环,因此,并非一切顺利。但是,如果您拥有更好的硬件,那么您会以某种方式拥有更差的软件吗?


2
“都是,不是”!
vzn13年

4
现在已经有了飞机,跨大西洋的货运不再都需要上船了,运输速度是否变得不那么重要了?联邦快递和DHL客户并不这么认为。
彼得·索尔

2
如果输入的大小足够大,则无论机器有多快,算法之间的数量级差异都是重要的。但是我偶尔会愚蠢地做出改变以“优化”一个恒定的因素差异,只是意识到使用内置在编程语言<cough> Python </ cough>的语法糖中的表达式比我的“优化”要快得多。
2013年

另请参阅摩尔定律
vzn13年

这里一个有趣的案例是如Windows,这在某些/许多方面的运行不太有效,即使在高度优化的硬件比以前...正如摩尔定律正在改善硬件,也似乎是在软件相应的通货膨胀法律所现代软件一直在做越来越多的事情,增加和增加了新的层……有点类似于气体填充所有可用体积的方式……或者其中预算无论大还是增加总是被消耗掉,或者有点
超车

Answers:


31

我非常喜欢《算法概论》一书中的示例,该示例说明了算法效率的重要性:

让我们比较两种排序算法:插入排序合并排序。它们的复杂度分别为O n log n = c 2 n lg n。通常,合并排序的常数因子较大,因此让我们假设c 1 < c 2O(n2)=c1n2O(nlogn)=c2nlgnc1<c2

为了回答您的问题,我们评估了运行插入排序算法的较快计算机(A)与运行合并排序算法的较慢计算机(B)的执行时间。

我们猜测:

  • 输入问题的大小为1000万个数字:n=107
  • 计算机A 每秒执行条指令(〜10GHz);1010
  • 计算机B 每秒仅执行条指令(〜10MHz);107
  • 常数因子为(略有高估)和c 2 = 50(实际上较小)。c1=2c2=50

因此,根据这些假设,

的计算机A至排序107号和

2(107)2 instructions1010 instructions/second=2104 seconds
107

50107lg107 instructions107 instructions/second1163 seconds

对于计算机B。

因此,速度要慢1000倍的计算机可以解决问题的速度快17倍。实际上,合并排序的优势将更加显着,并且随着问题的规模而增加。我希望这个例子有助于回答您的问题。

但是,这不仅仅涉及算法复杂性。今天,仅通过使用具有更高CPU频率的机器几乎不可能获得显着的加速。人们需要为可扩展的多核系统设计算法。这也是一项棘手的任务,因为随着内核数量的增加,开销(例如,用于管理内存访问)也随之增加。因此,几乎不可能获得线性加速。

综上所述,当今高效算法的设计与以前同样重要,因为与高效算法带来的频率提升相比,频率增加和额外内核都不会提高速度。


4
值得一提的是,线性加速的不可能源于阿姆达尔定律
Bartosz Przybylski 2013年

阿姆达尔法则并不总是适用。计算科学中存在很多问题,随着问题规模的增加,不可并行化工作的比例降至零。说计算需要Ñ 2工作,你需要计算Σ Ñ = 1个 ˚F X Ñ不同X ' š。在串行的时间成本是ø Ñ Ñ 2 + Ñ = Ö Ñ 3f(x)n2i=1nf(xi)nxisO(nn2+n)=O(n3),而与处理器并行,则功为O n 2 + n = O n 2nO(n2+n)=O(n2)
Nick Alger 2013年

“因此,速度慢1000倍的计算机可以快17倍来解决问题。”这是一个错误的陈述,因为您要同时组合硬件速度和不同的算法。而是分别比较每种类型的计算机A与计算机B的比较。(为什么不能在计算机A上使用合并排序,或者在计算机B上不使用插入排序?)
AquaAlex 2014年

3
@AquaAlex,该示例的目的是表明速度较慢的计算机仅通过选择的算法即可胜过速度较快的计算机。我们可以分别比较每种类型的排序的执行时间,也可以在A上运行合并排序,在B上运行插入排序。但是,显示一台速度更快的计算机通常比一台速度较慢的计算机要好得多是没有意义的。
Pavel Zaichenkov

好的,这样的想法是表明即使在一天中使用更快的cpu和更大的内存时,更高效的算法仍然可以承受重量。
AquaAlex 2014年

36

反之。在硬件价格越来越便宜的同时,还有其他一些发展。

首先,要处理的数据量呈指数增长。这导致了对准线性时间算法以及大数据区域的研究。例如,考虑一下搜索引擎-它们必须处理大量查询,处理大量数据并迅速进行处理。算法比以往任何时候都重要。

其次,机器学习领域正在变得越来越强大,并且充满了算法(尽管与您在BA中学到的算法不同)。这个领域正在蓬勃发展,每隔一段时间就会发明出一种真正新的算法,并显着提高性能。

第三,分布式算法变得越来越重要,因为我们在提高CPU处理速度方面遇到了障碍。如今,通过并行化来提高计算能力,其中涉及专用算法。

第四,为了平衡CPU不断增长的功能,现代编程范例采用虚拟机方法来解决安全漏洞。这使这些程序的速度明显降低。更令人困惑的是,您的操作系统正在花更多的时间在CPU上,而为您的实际程序留出更少的CPU时间,其中可能包括CPU密集型算法,例如视频压缩和解压缩。因此,尽管硬件速度更快,但使用效率却不高。

总结起来,高效的算法对于处理大量数据是必不可少的。人工智能领域出现了新的算法; 分布式算法成为人们关注的焦点;而且由于各种原因,CPU能力的利用效率较低(但主要是因为计算机变得越来越强大)。算法还没有死。


“算法还没有死”……恰恰相反,我们很可能正处于“算法的黄金时代”。……
vzn13年

12

算法的知识远不止如何编写快速算法。

它还为您提供了解决问题的方法(例如,分而治之,动态编程,贪婪,归约,线性编程等),您可以在遇到新的挑战性问题时应用这些方法。拥有合适的方法通常会导致代码更简单,编写起来更快。因此,我不得不不同意Kevin的回答,因为没有精心组合的代码通常不仅速度慢而且很复杂。我喜欢David Parnas的话:

我经常听到开发人员被形容为“知道如何快速构建大型系统的人”。快速构建大型系统没有技巧。建立它们的速度越快,它们就会变得越大!

(当然,我们还需要将算法与软件设计方法结合起来编写好的代码。)

算法知识还告诉我们如何组织数据,以便您可以通过使用数据结构更轻松,更有效处理它们。

此外,它为我们提供了一种估算方法效率的方法,并且可以了解几种不同方法之间在时间复杂度,空间复杂度和代码复杂度方面的取舍。知道这些权衡是在资源限制内做出正确决定的关键。

关于软件效率的重要性,我将引用维尔斯定律:

软件变得越来越慢,而硬件变得越来越快。

拉里·佩奇(Larry Page)最近重申,软件每18个月变慢一倍,因此超过了摩尔定律。


7

是的,它们在整个行业中的重要性相对而言要小一些。文本编辑器可能“足够快”,并且可能不需要太多改进。IT工作的大部分工作是确保用Java编写的组件A与用C编写的组件B可以通过用Cobol(或其他方式)编写的消息队列正确通信,或将产品推向市场等。

此外,架构变得复杂。当您使用普通的老式简单处理器时,每个周期只有1条指令,并且在汇编中编写时,优化是“容易的”(您只需要计算指令数)即可。当前,您没有简单的处理器,而是具有寄存器重命名和多级缓存的全管道,超标量,乱序的处理器。而且您不是用汇编语言编写的,而是用C / Java / etc编写的。在这里代码被编译/ JIT(通常是更好的代码,然后您或我会在汇编中编写),或者在Python / Ruby / ...中,代码被解释,并且您从计算机的多个抽象级别中分离出来。微优化很难实现,大多数程序员将获得相反的效果。

,它们在研究和“绝对”意义上同样重要。在某些区域,速度非常重要,因为它们需要处理大量数据。在这种规模上,复杂性至关重要,如Pavel示例所示。

但是,还有其他情况-当速度很重要时(HPC,嵌入式设备等),仍然选择从算法“下降”。您会在许多大学团体中找到专门从事编译器和/或软件优化的团体。例如,简单地交换循环顺序就可以使速度提高一千倍,这仅仅是因为它有效地利用了高速缓存-虽然这可能是一个极端的例子,但CPU与内存的差距在过去30年中增长了1000倍。计算机体系结构也是CS的一部分。因此,许多计算速度的提高实际上是普通CS领域的一部分。

在工业方面-当您拥有HPC群集时,速度很重要,因为单个程序可以运行数天,数月或数年。不仅您需要支付电费,而且等待也可能会花费金钱。您可以扔掉两倍的硬件,但对于最大的公司来说,700M $几乎不能算是零花钱-在这种情况下,程序员是更便宜的选择,如果将程序重写为新语言仅意味着“小”的提速-他们可能考虑一下。

同样,速度可能意味着更好的用户体验。许多关于手机操作系统的评论都指出,哪一个是“更聪明”的,尽管可以通过“技巧”来完成,但这无疑是一个研究领域。另外,您还希望更快地访问数据并快速执行所需的操作。有时,这意味着您可以做更多的事情-在游戏中,您有0.017s的时间可以做所有事情,而速度越快,您就可以放得越多。


2

这是一个有趣的讨论。我们这里有几件事要看。

  1. 理论计算机科学-这是一门不断发展的科学,意味着随着时间的流逝,我们将找到解决问题的更好的新方法,这意味着改进了搜索和排序算法。

  2. 更大的社区/更大的库-因为其他人已经完成了很多工作,所以我们可以在他们的工作上继续工作,并使用他们已经创建甚至编码的算法。这些库将随着时间更新,使我们能够自动访问更高效的程序/算法。

  3. 发展-现在我们这里有一个问题。许多程序员不是计算机科学家,因此他们编写代码来解决业务问题,而不是技术/理论问题,并且会喜欢使用冒泡排序作为快速排序之类的方法。在这里,硬件的速度允许不良的程序员摆脱使用不良算法和不良编码实践的困境。内存,CPU速度,存储空间这些不再是主要问题,而且每隔几个月它们就会变得越来越大,越来越快,越来越便宜。我的意思是看看新手机。它们现在比1970年代/ 80年代的大型机/服务器要先进。更多存储空间,更多处理能力,更快内存。

  4. UI和DATA-在大多数开发领域中,现在认为用户界面/用户体验和DATA比超高效代码更重要。因此,速度只有在用户不得不等待很长时间时才成为问题。如果我们为用户提供良好的外观和感觉,并且他从应用程序中获得了良好的响应,那么他会感到很高兴。而且,如果企业知道所有数据都已安全安全地存储,并且他们可以随时检索和操作它们,则无需理会它需要多少空间。

因此,我不得不说,并不是说高效的程序员不再重要或不再需要,而是很少有公司/用户会因为超高效的程序员而获得奖励,而由于硬件的改进,我们正在努力减少精简高效。但是,至少仍然有人关注效率,并且由于社区精神,每个人都可以从中受益。


1

关于这个有趣而深刻的问题的其他一些角度则强调了现象的跨学科和跨领域的方面。戴在回答中引用了沃思定律:

软件变得越来越慢,而硬件变得越来越快。

这个想法与经济学中观察到的现象有有趣的相似之处。请注意,经济学与计算机科学有着许多深厚的联系,例如在调度中,通过“负载平衡”算法根据需要分配稀缺资源(例如线程等)。另一个示例是所谓的生产者-消费者队列。此外,拍卖。

另外,例如,同名法律列表,维基百科

帕金森定律 –“工作不断扩展,以填补完成工作所需的时间。” 由C. Northcote Parkinson(1909–1993)创造,他也提出了这样的推论:“支出增加以赚取收入。” 在计算机中:程序将展开以填充所有可用内存。

与杰文的悖论也有很强的相似之处,在效率更高的瓦特蒸汽发动机开始取代纽康门设计之后,能源使用量增加,但使用或扩散的发动机增加了:

在经济学中,Jevons悖论(有时称为Jevons效应)是这样一种命题,即提高资源使用效率的技术进步趋向于(而不是降低)该资源的消耗率。

打个比方,硬件就是资源,软件就像资源的消耗(又名供应与需求)。这样的软件和硬件(和在每个前进)稍微存在在紧密耦合共生反馈环路彼此,在某种意义上说,共同进化。有许多复杂且相互关联的因素会影响这种相互作用,例如:


为什么要下票?我发现提到帕金森定律和杰文斯悖论非常有启发性。
Yuval Filmus 2013年

@YuvalFilmus我的猜测:语法问题。这次我没有发现太多困扰我阅读答案的能力,但是我尝试改进它。
Juho 2013年

1
这不是“语法问题”,而是另一种风格。这就好像说母语的人说自己的语言时会犯“错误”,而实际上两种语言都在变化,或者存在地区差异。在这种情况下,这是vzn的惯用风格。
Yuval Filmus 2013年

-3

不,主要是在考虑空间复杂性的同时!普通计算机的存储容量呈指数增长。


不可能相反-如果您拥有“无限”存储空间,则无需担心空间复杂性。问题不是存储在增长,而是要操作的数据同步增长,以填补计算能力和内存增加所带来的提速-这是一件好事,我们希望更现实地对宇宙建模,折叠更多蛋白质等。 (PS。我没有投反对票)
Maciej Piechotka

4
的确,许多移动应用程序开发人员似乎都承担着无限的资源,但是不幸的是,我的设备非常有限。
拉斐尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.