2009-02-12 134 views
7

当说这段代码需要一些优化,或者可以做一些优化时,这是什么意思?哪种代码需要优化?如何将优化应用于C#中的代码?那有什么好处?什么是代码优化?

回答

15

优化是一个非常广泛的术语。总体而言,这意味着修改系统以使其某些方面更有效地工作或使用更少的资源或更强大。例如,计算机程序可能会被优化,以便其执行速度更快或使用更少的内存或磁盘存储空间,或者在UI方面更具响应能力。

虽然“优化”与“优化”具有相同的根,但优化过程不会产生完全最优的系统:总是存在折衷,因此只有最感兴趣的属性才被优化。

请记住:

程序优化的第一条规则:不要做。程序优化的第二条规则(仅限专家!):不要这样做。 (Michael A. Jackson

+3

+1,但我讨厌杰克逊的报价。基本上它是说祈祷你已经设计了一个高性能系统,如果没有,推迟必要的修复直到最后一刻。海事组织,一个灾难的秘诀。我只是说,了解你的perforance要求,并据此发展。 – 2009-02-12 08:10:02

+1

我更喜欢Donald Knuth的话,“我们应该忘记小效率,大约97%的时间:不成熟的优化是万恶之源,但我们不应该在这个关键的3%中放弃我们的机会。”这个关键的3%是这个引用的一个特别重要的部分(通常被忽略)。这是低垂的果实。有时最大的收益可以通过最小的努力来实现。您只需花费一些时间来衡量和分析以找出这些瓶颈。 – 2011-08-17 19:35:36

-3

它可能是例如,代码中有一块代码被复制,可以/应该放入方法中,您可能会使用不推荐的方法/类,可能会有更简单的方法来执行代码正在做,可能有一些清理工作要做(例如删除硬编码)等等。

+0

我认为这就是所谓的重构。这不完全是一回事。 – 2009-02-12 07:32:19

3

代码优化使代码运行更快。这样做有两种主要方法:

1)将更多的工作压缩到更少的周期中。找出代码在做额外的拷贝的位置,或者在紧密的循环中有一个分支。这是在小的优化。

2)使您的算法更好地扩展。您可能听说过“大O”符号。这使得使用大量数据的算法会降低速度。

例如,如果您天真地搜索电话簿中的名称,您将从第1页开始,并阅读所有名称,直到找到您正在查找的名称。这将需要按照电话簿中姓名的数量进行缩放。我们称之为O(n)。现在想想你真的如何搜索电话簿。你向中间的某个地方开放,看看你正在寻找的名字是哪一边。这称为二进制搜索,并按名称数量的对数进行缩放。我们称之为O(logn)。它快得多。

记住优化的第一条规则:先测量。许多人多年来一直花费在优化代码上,而这些代码并没有太多运行。

5

Optimization是修改系统以使其某些方面更高效地工作或使用更少资源的过程。

你的情况主要是指2级:

设计水平

在最高级别,设计人员可以优化,使可用资源的最佳利用。这种设计的实现将受益于高效算法的良好选择,并且这些算法的实现将从编写高质量代码中受益。系统的架构设计压倒性地影响其性能。算法的选择比任何其他设计项目都更能影响效率。然而在某些情况下,优化依赖于使用更好的算法,利用特殊情况和特殊技巧并执行复杂的权衡;因此,如果评论不充分,对于缺乏经验的程序员来说,完全优化的程序有时候会更难理解,因此可能比未优化的版本包含更多的故障。

源代码级

避免质量不好的编码还可以提高性能,通过避免使用明显放缓。然而,在那之后,一些优化是可能的,这实际上降低了可维护性;有些但不是全部都可以通过优化编译器来执行。例如,通常需要使用更多的间接方法来简化或改进软件,但这种间接性会带来成本。

1

要添加到Anton Gogolev的答案,当一段代码需要优化时,这是因为不符合特定的性能要求。我们制定计划来满足用户的需求,对吗?大多数程序员往往主要考虑功能需求,即程序的功能,但用户也会有性能需求,提供什么资源成本(网络带宽,CPU周期,内存,磁盘空间等)功能。优化是更改一段代码以满足特定性能要求的过程。恕我直言,这应该发生在设计时,但你有时会写一段代码,只发现它表现不佳。要优化代码,首先必须找出哪些是您正在使用的资源。如果是CPU周期或内存,分析器可能会有所帮助。如果是网络带宽,这是目前很常见的网络带宽,则需要进行一些负载测试和通信分析。

我的建议是在编写代码之前始终了解您当前和未来的性能要求,并在设计阶段进行优化。晚优化是昂贵的,困难的,并且经常失败或导致难看的代码。

1

优化主要有两个目的:

  • 让你的软件使用更少的资源,例如,运行速度更快,更小,使用更少的内存,更少的硬盘空间都在运行时和存储文档时,网点少访问,...

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

你并不需要,只要没有相关的问题已经被提出来优化:这是更难以调试优化的代码,而不是优化正确的代码。

3

在进行代码优化时,您需要对代码进行度量,并尝试使其更高效。度量通常是指稀缺资源。

下面是常见的指标

  • 执行速度(通常是:第一,涉及到说的时候脑海优化)
  • 内存消耗
  • 可执行文件的大小(在嵌入式系统中,很重要)
  • 数据库访问
  • 远程服务访问(使其不那么健谈,缓存..)
  • 简洁,可读性,代码

优化后的代码应该给予同样的结果的可维护性。

问题是你必须做出选择。执行速度往往伴随着更多的内存消耗...

你也应该考虑全局优化。当您花费1000毫秒等待Web服务时,在循环中获得10毫秒的增益完全没用。