加速C#

时间:2008-10-08 14:22:59

标签: c# optimization performance

这实际上是两个问题,但它们非常相似,为了保持简单,我想我只是把它们放在一起:

  • 首先:鉴于已建立的C#项目,除了简单的代码内优化之外,还有什么方法可以加快速度?

  • 其次:在C#中从头开始编写程序时,有哪些好方法可以大大提高性能?

请远离常规优化技术,除非他们 C#特定

以前曾要求PythonPerlJava

17 个答案:

答案 0 :(得分:18)

脱离我的头顶:

  • 用通用对应物替换容器类的非泛型变体
  • 减少拳击/拆箱。具体而言,尽可能使用泛型,并且通常避免将值类型传递为object
  • 对于使用许多动态控件的对话框:在使用SuspendLayout / ResumeLayout插入所有控件之后暂停绘图。这有助于特别是在使用布局容器时。

答案 1 :(得分:12)

不幸的是,相对较少的优化是特定于语言的。基础知识适用于各种语言:

  • 根据实际负载衡量效果
  • 有明确定义的目标来指导您
  • 使用好的个人资料
  • 相对较早地优化架构/设计
  • 只有在您遇到问题时才进行微观优化

当你完全证明你需要进行微观优化时,探查器往往会明确地寻找什么 - 比如避免装箱和虚拟呼叫。

哦,我能想到的一件事是特定于.NET的:如果你需要经常拨打电话并且正在使用反射,convert those calls into delegates

编辑:建议使用泛型和StringBuilder等的其他答案当然是正确的。我(可能错误地)认为那些优化太“明显”了;)

答案 2 :(得分:10)

一件简单的事情是确保您的构建配置设置为“Release”。这将实现优化并消除调试信息,使您的可执行文件更小。

如果需要,请提供更多信息on MSDN

答案 3 :(得分:9)

使用合适的质量分析器并确定瓶颈所在。

然后开始询问如何提高效果。

任何在不了解您的表现形象和问题域的情况下做出“避免反思”等一揽子陈述的人都应该被拍摄(或至少重新教育)。考虑到.Net格局的大小,谈论C#优化几乎毫无意义:我们在谈论WinForms,ASP.Net,BizTalk,Workflow,SQL-CLR吗?如果没有上下文,即使是一般指导原则也可能浪费时间。

还要考虑“加速”和“提高绩效”的含义。您是指更高的资源效率,还是降低最终用户的感知等待时间(假设有一个)?这些是要解决的非常不同的问题。

鉴于论坛,我觉得有必要指出在Code Complete中对这些主题有一些很好的报道。不是C#特定的头脑。但那是件好事。请记住,特定于语言的微优化可能会被包含在您正在使用的任何编译器的下一个版本中。如果for和foreach之间的差异对您来说很重要,那么您可能正在编写C ++,对吧?

[我喜欢RedGate的ANTS Profiler,但我认为它可能会更好]

顺便说一句,有些想法:

  • 优先使用type(SomeType) instance.GetType()尽可能
  • 使用 优先考虑
  • 避免 拳击
  • 最多(我认为)3个字符串 做StringA + StringB +是可以的 StringC。之后你应该使用一个 StringBuilder的

答案 4 :(得分:3)

  • 使用StringBuilder而不是大量的字符串连接。 String对象是原子的,任何修改(追加,上层,填充等)实际上生成一个全新的字符串对象而不是修改原始对象。必须分配每个新字符串并最终收集垃圾。

  • 先前声明的概括:尝试重用对象而不是创建大量的对象。分配和垃圾收集可能很容易,但它们会影响您的表现。

  • 请务必使用提供的Microsoft库来处理大多数事情。框架提供的类通常使用不可用或难以从您自己的C#代码访问的功能(即调用本机Windows API)。内置库不是总是效率最高,但往往不是。

  • 编写异步应用程序从未如此简单。查看BackgroundWorker类等内容。

  • 尽管确实需要它们,但请不要定义Structs。类实例变量每个都包含对实际实例的引用,而struct实例变量每个都包含一个单独的副本。

答案 5 :(得分:3)

使用组合代替继承,限制装箱/拆箱,使用通用集合,使用foreach循环代替带有计数器的{},并使用标准Dispose模式释放资源。

优秀的书籍Effective C#中详细介绍了这些内容。

答案 6 :(得分:3)

描述您的代码。然后你至少可以了解你可以改进的地方。没有描绘你就是在黑暗中拍摄......

答案 7 :(得分:2)

很多缓慢与数据库访问有关。使您的数据库查询高效,您将为您的应用程序做很多事情。

答案 8 :(得分:0)

缓存查询产生的项目:

private Item _myResult;
public Item Result
{
     get
     {
          if (_myResult == null)
          {
               _myResult = Database.DoQueryForResult();
          }
          return _myResult;
     }
}

它是一种经常被启动程序员忽略的基本技术,也是提高应用程序性能的最简单方法之一。

从一个被认为是这个骗局的问题移植而来的答案。

答案 9 :(得分:0)

NGEN将帮助处理一些代码,但不要依赖它。

就个人而言,如果您的设计不好/慢,那么您无能为力。

在这种情况下,最好的建议是实施某种形式的昂贵任务缓存。

答案 10 :(得分:0)

我有以下MSDN文章的书签,并发现它是一个很好的一般参考。

Improving .NET application pefformance

答案 11 :(得分:0)

对于任何语言都是如此,而不仅仅是C#

  1. 对于现有的应用,不要做任何,直到你知道是什么让它变慢。恕我直言,this is the best way.

  2. 对于新应用,问题在于如何教授程序员。他们被教导用小山丘制造山脉。在使用this优化了一些应用程序之后,您将熟悉我称之为“疾驰的普遍性”的问题 - 层层叠叠的“抽象”,而不是简单地询问问题需要什么。你可以期待的最好的就是跟在他们之后,告诉他们他们刚刚放入的性能问题是什么,所以他们可以在他们进行时将它们拿出来。

答案 12 :(得分:0)

除了上面列出的编码最佳实践,包括在适当的时候使用StringBuilders和那种性质的项目。

我强烈建议使用代码分析工具,例如RedGate的ANTs Profiler。我发现在使用Profiler进行优化的标准步骤之后,我可以通过快速识别应用程序受到最大压力的代码区域来进一步优化我的代码。

答案 13 :(得分:0)

使用Ngen.exe(应随Visual Studio一起提供。)

http://msdn.microsoft.com/en-us/library/6t9t5wcf(VS.80).aspx

  

Native Image Generator(Ngen.exe)是一种可以提高托管应用程序性能的工具。 Ngen.exe创建本机映像,这些映像是包含已编译的特定于处理器的计算机代码的文件,并将它们安装到本地计算机上的本机映像缓存中。运行时可以使用来自缓存的本机映像,而不是使用实时(JIT)编译器来编译原始程序集。

答案 14 :(得分:0)

不要反复使用。

答案 15 :(得分:0)

我推荐你那些书:

Effective C#

More Effective C#

答案 16 :(得分:-1)

对于XP和Vista上的Windows窗体:全面打开双缓冲。它确实会导致透明度问题,因此您肯定想要测试UI:

protected override System.Windows.Forms.CreateParams CreateParams { 
    get { 
        CreateParams cp = base.CreateParams; 
        cp.ExStyle = cp.ExStyle | 0x2000000; 
        return cp; 
    } 
}