代码优化是什么?

7

当说这段代码需要优化时,或者可以进行某种程度的优化,这是什么意思?哪种类型的代码需要优化?如何在C#中应用优化?从中又能得到哪些好处?

7个回答

15

优化是一个非常广泛的术语。一般来说,它意味着修改系统,使其某些方面更加高效、使用更少的资源或更加健壮。例如,计算机程序可以被优化,使其执行速度更快,使用的内存或磁盘存储更少,或在UI方面更加响应。

尽管“优化”与“最优”的词根相同,但优化过程并不会产生完全最优的系统:总会有权衡,因此只有最感兴趣的属性才会被优化。

还要记住:

程序优化的第一条规则:不要进行优化。程序优化的第二条规则(仅供专家参考!):还不要进行优化。 (Michael A. Jackson)


3
+1,但我讨厌那句关于Jackson的话。基本上它是在说祈祷你设计了一个高效的系统,如果没有,就推迟必要的修复直到最后一刻。在我看来,这是一种灾难的配方。我只会说要理解你的性能要求并相应地开发。 - SmacL
1
我更喜欢Donald Knuth的这句话:“我们应该忘记小效率,大约97%的时间:过早优化是万恶之源。然而,在那关键的3%中,我们不应该放弃机会。” 这个关键的3%是这句话特别重要(并经常被忽视)的部分。它是低垂的果实。有时候,最大的回报可以通过最小的努力实现。你只需要花一点时间来测量和分析,找到那些瓶颈。 - Steve Wortham

5

优化是指修改系统以使其某个方面更加高效或使用更少资源的过程。

在您的情况下主要涉及以下两个层面:

设计层面

在最高层面上,设计可以被优化以最大限度地利用可用资源。该设计的实现将受益于选择高效算法和编写高质量代码。系统的架构设计极大地影响其性能。算法的选择比设计中的任何其他项目都更影响效率。然而,在某些情况下,优化依赖于使用更高级的算法,利用特殊情况和特殊技巧,并执行复杂的权衡;因此,完全优化的程序有时可能更难为经验不足的程序员理解,因此可能包含比未优化版本更多的错误。

源代码层面

避免低质量的编码也可以提高性能,从而避免明显的减速。然后,一些优化是可能的,这些优化实际上会降低可维护性;其中一些,但并非全部,现在可以通过优化编译器来执行。例如,使用更多间接寻址通常需要简化或改进软件,但该间接寻址具有成本。


3
代码优化是使代码运行更快的过程。有两种主要方法:
1)在更少的周期内完成更多的工作。找出代码中是否存在额外的复制或者在紧密循环中是否存在分支。这是小范围优化。
2)使算法更好地适应规模。您可能听说过“大O”符号。这是使算法随着大数据集而降解得更慢。例如,如果您简单地在电话簿中搜索一个姓名,您将从第一页开始阅读所有的姓名,直到找到您要找的那个人。这将花费一定数量的指令,与电话簿中的姓名数成比例。我们称之为O(n)。现在想象一下您如何真正搜索电话簿。您打开电话簿的某个地方,看看要查找的姓名在哪一边。这被称为二分查找,并且随着名称数量的对数缩放。我们称之为O(logn)。它更快。
请记住优化的第一条规则:先进行测量。许多人年都花在了优化很少运行的代码上。

我会将“运行更快”扩展为“消耗更少的资源”。 - peterchen
这很有用,但更多的解释会更好。假设我有数千个名字,每个名字都有一个或多个电话号码,在搜索每个名字及其所有电话号码时,必须循环遍历每个名字并选择它的电话号码。如何在这里进行优化?如何应用大O记法? - Abdullah BaMusa
我倾向于同意Peter Chen的观点,即当今耗尽的主要资源不是CPU周期。在我看来,它是网络带宽,因此需要努力优化音视频编解码器等... - SmacL

3
在进行代码优化时,你需要对代码度量,并尝试使其更加高效。这些度量通常指稀缺资源。
以下是常见的度量:
- 执行速度(通常是说到优化时首先想到的) - 内存消耗 - 可执行文件大小(在嵌入式系统中可能很重要) - 数据库访问 - 远程服务访问(减少聊天,使用缓存等) - 代码的简洁性、可读性和可维护性
优化后的代码应该提供相同的结果。
问题在于你必须做出选择。执行速度往往会伴随着更多的内存消耗......
你也应该全局考虑优化。在一个循环中获得10ms的收益,而在之后花费1000ms等待Web服务则完全没有意义。

1
补充Anton Gogolev的回答,当一段代码需要优化时,是因为某个特定的性能要求没有达到。我们开发程序是为了满足用户需求,对吧?大多数程序员往往在功能需求方面思考,即程序做什么,但用户也会有性能需求,即提供功能的资源成本(网络带宽、CPU周期、内存、磁盘空间等)。优化是改变一段代码以满足特定性能要求的过程。在我看来,这应该在设计阶段完成,但有时你会写一段代码,只发现它表现不佳。要优化代码,首先必须找出你正在过度使用的资源。如果是CPU周期或内存,可能需要使用分析器。如果是网络带宽,这是目前非常普遍的情况,你需要进行一些负载测试和通信分析。
我的建议是,在编写代码之前始终了解当前和可能的未来性能要求,并在设计阶段进行优化。晚期优化是昂贵、困难的,而且往往失败或导致丑陋的代码。

1

优化有两个主要目的:

  • 使您的软件使用更少的资源,例如运行更快,更小,使用更少的RAM,存储文档时和运行时使用更少的硬盘空间,减少网络访问等。

  • 通过重构使您的软件更易于维护。

只有在出现相关问题时才需要进行优化:调试经过优化的代码比优化正确的代码要困难得多。


-3
它可能是因为代码有一段被重复的代码块,可以/应该放入一个方法中;你可能正在使用已弃用的方法/类;可能有更简单的方法来完成代码所做的事情;可能还需要进行一些清理(例如,移除硬编码)等等...

我认为那被称为重构。它不完全是同一件事情。 - Steve Rowe

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