如果Moore's Law成立,并且CPU / GPU变得越来越快,那么软件(以及通过关联,您的软件开发人员)是否仍然会在您仍然需要优化代码的范围内突破界限?或者,一个天真的因子解决方案是否足以满足您的代码(等)?
答案 0 :(得分:31)
2倍的处理能力对改善糟糕的n ^ 2搜索的可怕性没有太大帮助。
答案 1 :(得分:18)
糟糕的代码总能克服CPU速度。
要获得一个很好的示例,请转到此Coding Horror列并向下滚动到描述编程珍珠一书的部分。转载的图表显示,对于某种算法,具有4.77MHz 8位处理器的TRS-80如何能够击败32位Alpha芯片。
目前的加速趋势是增加更多核心,因为 hard 会使个别核心变得更快。因此总体速度上升,但线性任务并不总是有益。
“没有蛮力和无知无法克服的问题”并非总是如此。
答案 2 :(得分:13)
计算机越快,我们就越期望它们。
答案 3 :(得分:12)
无论是视频游戏中更多多边形的代码更快,还是金融市场交易的更快算法,如果竞争优势更快,优化仍然很重要。你不必去追逐追逐你和你的伙伴的狮子 - 你只需要挑战你的伙伴。
答案 4 :(得分:11)
在所有程序员第一次编写最佳代码之前,总会有优化的地方。同时,真正的问题是:我们应该首先优化什么?
答案 5 :(得分:10)
软件变得越来越慢,硬件变得越来越快。
P.S。更严重的是:随着计算模型转向并行处理,代码优化变得更加重要。如果你优化你的代码2x并且它在1个单独的盒子上运行5分钟而不是10分钟,那可能不是那么令人印象深刻。具有2倍速的下一台计算机将对此进行补偿。但想象一下你在1000个CPU上运行你的程序。然后任何优化都会节省大量的机器时间。和电。优化并拯救地球! :)
答案 6 :(得分:10)
摩尔定律谈到我们可以在芯片上装多少个晶体管 - 对于那些能够以越来越快的速度切换的晶体管没有什么可说的。实际上,在过去的几年中,时钟速度或多或少停滞不前 - 我们只是不断变得越来越多“核心”(基本上是完整的CPU)每个芯片。要利用这一点需要并行化代码,所以如果你正在“天真地”编写,那么未来的神奇优化器将忙于在你的代码中发现隐藏的并行性,以便它可以将它转移到多个核心(更现实地,对于可预见的未来,你必须经常帮助你的编译器; - )。
答案 7 :(得分:5)
计算任务似乎分为大致两大类。
大多数问题都适合第一类。例如,实时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)
是的,我们正处于优化至关重要的地步,并且在可预见的未来将会存在。这是因为:
答案 21 :(得分:0)
让我们希望网络速度保持不变,这样我们就可以通过线路挖掘足够的数据来跟上CPU的步伐......
如前所述,总会出现瓶颈
答案 22 :(得分:0)
假设你的CPU拥有与宇宙中亚原子粒子数量一样多的晶体管,并且它的时钟以硬宇宙射线的频率运行,你仍然可以击败它。
如果您想要保持领先于最新的CPU时钟,只需在循环中添加另一级别的嵌套,或在子例程调用中添加另一级别的嵌套。
或者如果你想要真正专业,可以添加另一层抽象。
这并不难: - )
答案 23 :(得分:0)
即使CPU越来越快,您也可以随时优化
(这是我过去半年见过的真实世界的例子)。
复杂计算机系统的不同部分在计算历史的不同点被认为是昂贵的。你必须衡量瓶颈并判断努力的位置。
答案 24 :(得分:0)
优化成本非常低,所以我怀疑是否有必要放弃它。真正的问题是找到利用所有计算能力的任务 - 所以我们将优化我们在parallel中做事的能力,而不是放弃优化。
答案 25 :(得分:0)
鉴于计算机的速度比几十年前快了一千倍,但通常看起来不会快得多,我会说在我们不再担心优化之前,我们还有很长的路要走。问题是随着计算机变得越来越强大,我们让计算机为我们做越来越多的工作,这样我们就可以在更高的抽象层次上工作。每个抽象级别的优化仍然很重要。
是的,计算机可以更快地执行许多操作:您可以在几分钟内绘制Mandelbrot,这需要几天的计算机时间。 GIF几乎瞬间加载,而不是在屏幕上绘制可见秒数。很多东西都比较快。但是,例如,浏览速度并不是那么快。文字处理速度不是那么快。随着计算机变得越来越强大,我们只期望更多,我们让计算机做更多。
优化对于可预见的未来非常重要。但是,微优化远不如以前那么重要。这些天最重要的优化可能是算法的选择。你选择O(n log n)还是O(n ^ 2)......等等。