优化代码是否变得不必要?

时间:2009-06-12 23:59:25

标签: optimization gpu performance cpu-speed moores-law

如果Moore's Law成立,并且CPU / GPU变得越来越快,那么软件(以及通过关联,您的软件开发人员)是否仍然会在您仍然需要优化代码的范围内突破界限?或者,一个天真的因子解决方案是否足以满足您的代码(等)?

26 个答案:

答案 0 :(得分:31)

2倍的处理能力对改善糟糕的n ^ 2搜索的可怕性没有太大帮助。

答案 1 :(得分:18)

糟糕的代码总能克服CPU速度。

要获得一个很好的示例,请转到此Coding Horror列并向下滚动到描述编程珍珠一书的部分。转载的图表显示,对于某种算法,具有4.77MHz 8位处理器的TRS-80如何能够击败32位Alpha芯片。TRS-80 vs. Alpha

目前的加速趋势是增加更多核心,因为 hard 会使个别核心变得更快。因此总体速度上升,但线性任务并不总是有益。

“没有蛮力和无知无法克服的问题”并非总是如此。

答案 2 :(得分:13)

计算机越快,我们就越期望它们。

答案 3 :(得分:12)

无论是视频游戏中更多多边形的代码更快,还是金融市场交易的更快算法,如果竞争优势更快,优化仍然很重要。你不必去追逐追逐你和你的伙伴的狮子 - 你只需要挑战你的伙伴。

答案 4 :(得分:11)

在所有程序员第一次编写最佳代码之前,总会有优化的地方。同时,真正的问题是:我们应该首先优化什么?

答案 5 :(得分:10)

Wirth's law

  

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

P.S。更严重的是:随着计算模型转向并行处理,代码优化变得更加重要。如果你优化你的代码2x并且它在1个单独的盒子上运行5分钟而不是10分钟,那可能不是那么令人印象深刻。具有2倍速的下一台计算机将对此进行补偿。但想象一下你在1000个CPU上运行你的程序。然后任何优化都会节省大量的机器时间。和电。优化并拯救地球! :)

答案 6 :(得分:10)

摩尔定律谈到我们可以在芯片上装多少个晶体管 - 对于那些能够以越来越快的速度切换的晶体管没有什么可说的。实际上,在过去的几年中,时钟速度或多或少停滞不前 - 我们只是不断变得越来越多“核心”(基本上是完整的CPU)每个芯片。要利用这一点需要并行化代码,所以如果你正在“天真地”编写,那么未来的神奇优化器将忙于在你的代码中发现隐藏的并行性,以便它可以将它转移到多个核心(更现实地,对于可预见的未来,你必须经常帮助你的编译器; - )。

答案 7 :(得分:5)

计算任务似乎分为大致两大类。

  1. 有限计算需求的问题。
  2. 无限计算需求的问题。
  3. 大多数问题都适合第一类。例如,实时3D光栅化。很长一段时间,这个问题是典型的消费电子产品所无法企及的。没有令人信服的3D游戏或其他程序可以在Apple上产生实时世界[]。最终,技术赶上了,现在这个问题是可以实现的。类似的问题是蛋白质折叠的模拟。直到最近,才有可能将已知的肽序列转化为所得的蛋白质分子,但现代硬件使得这可以在几小时或几分钟的处理过程中实现。

    但是有一些问题,它们本质上可以吸收所有可用的计算资源。其中大多数是动态物理模拟。显然它可以执行比如天气的计算模型。只要我们有电脑,我们就一直这样做。然而,这种复杂的系统受益于提高的准确性。在更精细的空间和时间分辨率下进行仿真可以逐位改进预测。但无论任何给定的模拟具有多大的准确性,都可以获得更高的准确性,并获得以下好处。

    两种类型的问题都非常适用于所有种类的优化。第二种类型是相当明显的。如果进行模拟的程序稍微改进一点,那么它运行得更快一点,结果会更快或更准确。

    第一个是更微妙的。在一段时间内,没有任何优化是值得的,因为没有足够快的计算机存在。经过一段时间,优化有点毫无意义,因为运行它的硬件比所需的快很多倍。但是有一个狭窄的窗口,在此期间,最佳解决方案将在当前硬件上可接受地运行,但不是最佳解决方案。在此期间,仔细考虑优化可能是首次上市的产品与之间的差异。

答案 8 :(得分:3)

优化永远是必要的,因为摩尔定律的缓解因素是bloatware

答案 9 :(得分:3)

优化比速度还要多。摩尔定律不适用于计算机内存。此外,优化通常是编译代码以利用CPU特定指令的过程。这些只是我能想到的一些优化,这些优化不会被更快的CPU解决。

答案 10 :(得分:2)

其他答案似乎集中在问题的速度方面。没关系。我能看到的真正问题是,如果你优化你的代码,运行它会花费更少的精力。您的数据中心运行温度更低,笔记本电脑的使用寿命更长,手机充电时间超过一天。在这个市场的末端有一个真正的选择压力。

答案 11 :(得分:1)

世界在变化,我们需要随之改变。当我第一次开始时,成为一名优秀的程序员就是要知道你可以做的所有小微优化,通过操纵C中的指针和其他类似的东西来挤出另外0.2%的例行程序。现在,我花了更多的时间来使算法更容易理解,因为从长远来看,这更有价值。但是 - 总有一些事情要优化,而且总是存在瓶颈。更多的资源意味着人们对他们的系统抱有更多的期望,所以对于专业人士而言,草率不是一个有效的选择。

优化策略会随着您添加更多速度/内存/资源而改变。

某些优化与速度无关。例如,在优化多线程算法时,您可能正在优化共享锁总数的减少。如果您当前的处理能力等待锁定,那么以速度(或更糟的是处理器)的形式添加更多处理能力可能没有任何影响....如果您做错了事情,添加处理器甚至可以降低整体性能。在这种情况下优化意味着尝试减少锁的数量,并尽可能保持细粒度,而不是试图减少指令数。

答案 12 :(得分:1)

我认为所有这一切的结果是计算能力越来越低,以至于程序员可以花更少的时间来完成给定的任务。例如,像Java或Python这样的高级语言几乎总是比像Assembly这样的低级语言慢。但是对于程序员来说,新事物是可能的更容易。我认为最终目的地是计算机能够直接与人类通信,并将人类语音编译成字节码。然后程序员将不复存在。 (计算机可能会占领世界)

答案 13 :(得分:1)

计算机就像一个青少年的房间。

它永远不会足以容纳所有垃圾。

答案 14 :(得分:1)

计算机速度无法始终克服人为错误。问题可能是措辞,“ CPU会变得足够快编译器可以花时间来捕捉(和修复)实施问题。”显然,需要(在可预见的未来)代码优化来修复Shlemiel the painter类型的问题。

软件开发仍然是告诉计算机完全该做什么的问题。什么“越来越快”的CPU将给我们带来的是设计越来越抽象和自然的编程语言的能力,最终到了计算机采取我们的意图并实现所有低级细节的地步......总有一天

享受,

Robert C. Cartaino

答案 15 :(得分:1)

只要有些人编写使用过多资源的慢代码,其他人就必须优化代码以更快地提供这些资源并提高速度。

我发现一些开发人员编写次优代码的创意有多么神奇。在我之前的工作中,一个人编写了一个函数来计算两个日期之间的时间,例如,继续递增一个日期并进行比较。

答案 16 :(得分:1)

在许多情况下仍需要优化,尤其是:

  • 实时系统,其中cpu时间非常宝贵

  • 内存占用内存的嵌入式系统

  • 服务器,许多流程需要同时注意

  • 游戏,3D射线追踪,音频,人工智能和网络可以制作非常苛刻的节目

答案 17 :(得分:0)

在某种程度上总是需要优化代码,而不仅仅是为了加快执行速度和降低内存使用。例如,找到处理信息的最佳节能方法将是数据中心的主要要求。分析技能将变得更加重要!

答案 18 :(得分:0)

对或错,它已经在我看来发生了,并不总是坏事。更好的硬件确实为开发人员提供了更多精力解决手头问题的机会,而不是担心额外10%的内存利用率。

优化是无可争议的,但仅限于需要时。我认为额外的硬件功能只是减少真正需要的实例。然而,无论谁正在编写软件以启动航天飞机到月球更好地使他的代码优化:)

答案 19 :(得分:0)

最终我们无法加速,最终我们将受到空间的限制,因此为什么你会看到3GHZ和多核心下的新处理器..所以优化仍然是必要的。

答案 20 :(得分:0)

是的,我们正处于优化至关重要的地步,并且在可预见的未来将会存在。这是因为:

  • RAM速度的增加速度低于CPU速度。因此,CPU和RAM之间的性能差距仍在扩大,如果您的程序大量访问RAM,则必须优化访问模式以有效利用缓存。否则超高速CPU将在90%的时间内处于空闲状态,只是等待数据到达。
  • 核心数量增加和增加。您的代码是从每个添加的核心中受益还是在单个核心上运行?这里的优化意味着并行化,并且,根据手头的任务,它可能很难。
  • CPU速度永远不会赶上指数算法和其他蛮力的东西。正如answer所阐述的那样。

答案 21 :(得分:0)

让我们希望网络速度保持不变,这样我们就可以通过线路挖掘足够的数据来跟上CPU的步伐......

如前所述,总会出现瓶颈

答案 22 :(得分:0)

假设你的CPU拥有与宇宙中亚原子粒子数量一样多的晶体管,并且它的时钟以硬宇宙射线的频率运行,你仍然可以击败它。

如果您想要保持领先于最新的CPU时钟,只需在循环中添加另一级别的嵌套,或在子例程调用中添加另一级别的嵌套。

或者如果你想要真正专业,可以添加另一层抽象。

这并不难: - )

答案 23 :(得分:0)

即使CPU越来越快,您也可以随时优化

  • 网络吞吐量,
  • disk seek,
  • 磁盘使用情况,
  • 内存使用情况,
  • 数据库事务,
  • 系统调用次数
  • 调度和锁定粒度,
  • 垃圾收集。

(这是我过去半年见过的真实世界的例子)。

复杂计算机系统的不同部分在计算历史的不同点被认为是昂贵的。你必须衡量瓶颈并判断努力的位置。

答案 24 :(得分:0)

优化成本非常低,所以我怀疑是否有必要放弃它。真正的问题是找到利用所有计算能力的任务 - 所以我们将优化我们在parallel中做事的能力,而不是放弃优化。

答案 25 :(得分:0)

鉴于计算机的速度比几十年前快了一千倍,但通常看起来不会快得多,我会说在我们不再担心优化之前,我们还有很长的路要走。问题是随着计算机变得越来越强大,我们让计算机为我们做越来越多的工作,这样我们就可以在更高的抽象层次上工作。每个抽象级别的优化仍然很重要。

是的,计算机可以更快地执行许多操作:您可以在几分钟内绘制Mandelbrot,这需要几天的计算机时间。 GIF几乎瞬间加载,而不是在屏幕上绘制可见秒数。很多东西都比较快。但是,例如,浏览速度并不是那么快。文字处理速度不是那么快。随着计算机变得越来越强大,我们只期望更多,我们让计算机更多。

优化对于可预见的未来非常重要。但是,微优化远不如以前那么重要。这些天最重要的优化可能是算法的选择。你选择O(n log n)还是O(n ^ 2)......等等。