代码清晰度是否会影响应用程序的性能?

10

随着当今代码越来越复杂,代码需要设计成易于维护-也就是易于阅读和理解。

话虽如此,我不禁想起几年前运行的程序,比如Winamp或某些游戏,您需要一个高性能程序,因为您的486 100 Mhz无法使用那个美丽的mp3播放器播放mp3并消耗所有CPU周期。

现在我运行媒体播放器(或其他软件),开始播放mp3,它会占用我的四个核心中的其中一个的25-30%。这怎么可能!如果486都可以做到,同样的操作怎么会占用这么多处理器?

我自己也是一名开发人员,我曾经建议:保持代码简单,不要过早地进行性能优化。似乎我们已经从“尽可能少地使用CPU”变成了“如果不太占用CPU就可以”。

那么,您认为我们是否忽视优化而破坏了性能呢?


3
我怀疑代码清晰度不是媒体播放器问题的原因。 - Frank Schwieterman
5
尽管我认为这可能是一个值得回答的有意义的问题,但我有点困惑,因为你第一个猜测一个应用程序为什么会慢是由于开发人员编写了清晰的代码。:) 不过总的来说,我认为很多人将一般的“软件膨胀”(一个相当模糊的术语)归因于一些现代应用程序的缓慢。 - Falaina
我不是说性能不重要,但在任何地方(包括Stackoverflow)有人会问:“我应该使用这个还是那个来提高性能?” 答案几乎总是,“不,不要关心性能,除非出现问题。” 因此,我们只将性能视为一种错误,而不是一种功能... - Jorge Córdoba
2
我认为很多Stackoverflow程序员从事商业应用程序开发,这需要具备可维护性。其他Stackoverflow程序员从事Web开发,时间至关重要。游戏程序员总是担心代码速度。首先让它能够工作,然后再优化速度。 - Nosredna
你尝试过在负载下运行相同的测试吗?也许“媒体播放器”注意到有更多的CPU可用,正在尝试提供最丰富的播放体验? - JB King
10个回答

35

良好的代码不会影响性能,糟糕的代码才会影响性能。


2
很好的表述。一个干净的算法会比一个“调整”不良算法表现得更出色。当涉及到 GUI 应用时,一些开发人员不理解数据和事件驱动的用户界面是如何组装的,而“蛮力”替代方案会导致你所描述的情况。这不是代码清晰度,而是代码的天真。 - Sam Harwell

19

我发现相反的情况更为真实。在我的经验中,最易读和易于维护的代码通常具有最佳总体性能。那些难以阅读且臃肿的代码往往存在性能瓶颈,并且这些瓶颈往往出现在极其难以移除或重构的地方,因此它们只会被留在那里。


我完全同意。https://dev59.com/mnNA5IYBdhLWcg3whuV_#927773 - Mike Dunlavey
我更喜欢称它们为“毛球”,但+1。 - kenny

5

如果你是winamp的粉丝,你可能会喜欢阅读这篇关于Justin Frankel在AOL收购WinAmp后的有趣经历的文章。

他最新的产品是Reaper

优化在平台长期固定且你可以真正学习它时才有意义。这在游戏主机上仍然发生。

我曾为游戏编写过大量紧凑的汇编语言代码,我可以告诉你这需要时间。你一遍又一遍地编写相同的代码,并改变你的数据结构,试图获得更高的帧率。

PC应用程序上不再有这样的压力了。假设额外工作投入很少会产生回报,任何想要快速响应的人都会购买更快的电脑。


2

就 MP3 播放器而言,你可能在进行不同的比较。旧的 486 MP3 播放器只能播放 MP3 文件,媒体播放器带有大量花哨的效果、透明界面等等。更不用说它可能还在向全球各地的微软服务器汇报你在听什么歌曲了 :-)

实际上,我认为这个问题更普遍,我们现在期望的用户界面体验付出了 CPU 和内存的代价。我认为这将比代码结构的额外开销更重要(而且与10年前相比,我们的编译器也聪明了很多,所以我甚至怀疑在机器码级别上这是否是一个因素)。


这正是我所想的。iTunes在使用可视化器时会消耗9-10倍的CPU资源,而没有使用可视化器时则不会。这还包括了滤波器(EQ等)来增强声音,而这些功能在486时代可能没有被广泛使用。 - Jarrod

1

开发人员不应该害怕优化他们的应用程序。今天应用程序的臃肿和缓慢令人震惊。


++ 不再重复冗余的重复,但你是对的。https://dev59.com/mnNA5IYBdhLWcg3whuV_#927773 - Mike Dunlavey
开发人员不应该害怕优化。优化需要与其他需要完成的任务一样被优先考虑,例如更多/更好的功能、错误修复、可用性测试等。除非开发人员也是产品所有者,否则他们不应该决定进行优化。 - nicholaides
事后优化必须与其他任务一样被优先考虑,但是优化应该始终作为开发人员开发的标准行动来实施。我们不应该故意编写非最优代码(除非有压倒性的原因)。产品所有者不应该在开发细节上胡乱搞。 - Lance Roberts

1

好看的代码可以是快速的代码。问题可能有很多:

  • 高级语言大大缩短了开发时间,但可能会消耗处理器时间。对于大量应用程序来说,这是一个很好的权衡
  • 程序员对算法的了解不如以前——这可能与高级语言有关,因为人们只使用他们语言内置的sort()而不是选择快速排序而不是插入排序
  • 现在的应用程序做得更多了。我敢肯定,媒体播放器比旧版WinAmp拥有更多功能

我不会说快速代码已经死了。作为反例,看看操作系统代码(Linux中的O(1)调度程序就是一个例子),当然还有游戏代码。


0

很容易将过度设计的代码与清晰的代码混淆。前者通常难以维护,可能会产生难以理解的瓶颈。但是UML图表可能看起来非常整洁。


0
个人而言,我总是努力在性能和可维护性之间取得平衡。我们早已经过了CPU时间昂贵而程序员廉价的日子,但作为用户和开发者,发现在更新的硬件上运行的同一软件的新版本执行相同任务需要更长时间,这真是让人沮丧。因此,主观地说,我认为有些公司已经走得太远了。

1
我认为性能与可维护性是相互关联的,而不是相互对立的。 - Mike Dunlavey
大部分是对的,但我之前表述不够清楚。我想要表达的更多是像你在答案中指出的那样;我曾经见过“超级易维护”的代码,它不仅速度慢,而且至少对我来说更难以理解。正如我所说,“平衡”很重要。虽然大多数应用程序不需要最佳性能,但由于面向对象已经变得无处不在,应用程序(至少从用户的角度)变得更加缓慢和臃肿,而硬件速度继续提高。性能差距来自哪里? - Adrien

0
在我处理非学术软件的经验中,最大的性能杀手是使用许多层抽象,每一层都会产生适度的性能惩罚,但它们像复利一样结合在一起。每个抽象层都可以被认为是“好事”和“推荐的做法”,直到你看到为此付出的代价。
特别是在事件驱动设计中,你会看到这种情况,看似无害的事情,比如设置一个属性,会在类的网络中产生级联效应。

-1

我不知道有任何一种好的编译器在给定干净、书写良好的源代码时不能生成快速高效的代码。

如果您使用某种形式的代码生成器,那么它将取决于生成器输出的源代码的“好坏”。过去,我曾看到过代码生成器为看似简单的操作创建了大量垃圾代码。我认为工具设计师们患上了“所有东西和厨房水槽”病。现代工具应该更加精简,但在支付大笔费用之前最好检查一下工具。

同样地,如果您编写自己的代码,今天我所知道的每个编译器都会接受良好、干净的代码并创建优化良好、快速的可执行文件(除非您为了调试等目的关闭了所有优化)。

祝福您,

-R


编译器很棒,但这并不意味着它们可以自行生成闪电般快速的代码。要制作一个高效处理媒体(音频DSP、视频、动画)的应用程序仍然需要付出大量的努力。 - Nosredna
1
我发现良好的性能取决于使用良好的数据结构,编写高效的算法,并且不做比必要更多的工作,在使用分析器识别瓶颈后进行代码优化。我认为良好的性能与代码的清晰程度无关。 - waterlooalex
一个糟糕的算法无论编译器多么“酷炫”和代码多么易于维护,都会很慢。 - Adrien

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接