加速C#
这确实是两个问题,但它们非常相似,为了简单起见,我想我把它们放在一起:加速C#,c#,optimization,performance,C#,Optimization,Performance,这确实是两个问题,但它们非常相似,为了简单起见,我想我把它们放在一起: 首先:给定一个已建立的C#项目,除了简单的代码优化外,还有哪些合适的方法可以加速它 其次:在用C#从头开始编写程序时,有哪些好方法可以大大提高性能 请远离一般优化技术,除非它们是针对C的。 这是以前要求的,并且。NGEN将帮助编写一些代码,但不要指望它 就个人而言,如果你的设计很差/很慢,你就无能为力 在这种情况下,最好的建议是对昂贵的任务实施某种形式的缓存。很多慢度都与数据库访问有关。让你的数据库查询高效,你会为你的应
- 首先:给定一个已建立的C#项目,除了简单的代码优化外,还有哪些合适的方法可以加速它
- 其次:在用C#从头开始编写程序时,有哪些好方法可以大大提高性能
这是以前要求的,并且。NGEN将帮助编写一些代码,但不要指望它 就个人而言,如果你的设计很差/很慢,你就无能为力
在这种情况下,最好的建议是对昂贵的任务实施某种形式的缓存。很多慢度都与数据库访问有关。让你的数据库查询高效,你会为你的应用做很多事情 在我的头顶上:
- 将容器类的非泛型变体替换为泛型变体
- 减少装箱/拆箱。具体来说,在可能的情况下使用泛型,通常避免将值类型传递为
object
- 对于使用许多动态控件的对话框:使用
/SuspendLayout
插入所有控件之前,暂停绘图。这在使用布局容器时尤其有用ResumeLayout
- 根据实际负载测量性能
- 有明确的目标来指导你
- 使用一个好的分析器
- 尽早优化架构/设计
- 只有当你有一个已证实的问题时才进行微观优化
- 使用StringBuilder而不是大量的字符串连接。字符串对象是原子的,任何修改(追加到上限、填充等)实际上都会生成一个全新的字符串对象,而不是修改原始对象。必须分配每个新字符串,并最终进行垃圾回收
- 对前面陈述的概括:尝试重用对象,而不是创建大量的对象。分配和垃圾收集可能很容易,但它们会影响您的性能
- 请确保在大多数情况下使用提供的Microsoft库。框架提供的类通常使用不可用或难以从自己的C#代码访问的功能(即调用本机Windows API)。内置库并不总是最有效的,但往往不是
- 编写异步应用程序从未如此容易。看看BackgroundWorker类之类的东西
- 尽量不要定义结构,除非你真的需要它们。类实例变量各自持有对实际实例的引用,而结构实例变量各自持有单独的副本
- 一件简单的事情是确保构建配置设置为“Release”。这将启用优化并消除调试信息,使可执行文件更小
如果需要,请提供更多信息。我向您推荐这些书:
不要使用太多的反射。不幸的是,相对较少的优化是特定于语言的。基础知识适用于各种语言:
除了上面列出的编码最佳实践之外,还包括在适当的时候使用StringBuilder以及该性质的项目
我强烈建议使用代码分析工具,如RedGate的ANTs Profiler。我发现,在采取标准的优化步骤之后,使用分析器,我可以通过快速识别应用程序影响最大的代码区域来进一步优化代码。使用组合而不是继承,限制装箱/拆箱,使用泛型集合,使用foreach循环而不是{}使用计数器,并使用标准的Dispose模式释放资源
优秀的《有效的C#》一书详细介绍了这些问题。分析您的代码。然后你至少可以了解你可以改进的地方。如果不进行分析,您将在黑暗中拍摄…使用优质的分析工具,确定瓶颈所在 然后开始询问如何提高绩效 任何人如果在不了解你的绩效状况和问题领域的情况下发表“避免反思”之类的笼统言论,都应该被枪毙(或至少重新教育)。考虑到.Net环境的规模,谈论C#优化几乎毫无意义:我们是在谈论WinForms、ASP.Net、BizTalk、工作流、SQL-CLR吗?如果没有上下文,即使是一般性的指导方针也充其量只是浪费时间 还要考虑一下你所说的“加速”和“提高性能”是什么意思。您的意思是提高资源效率,还是减少最终用户的感知等待时间(假设有)?这些是需要解决的截然不同的问题 鉴于这个论坛,我觉得有必要指出
protected override System.Windows.Forms.CreateParams CreateParams {
get {
CreateParams cp = base.CreateParams;
cp.ExStyle = cp.ExStyle | 0x2000000;
return cp;
}
}
private Item _myResult;
public Item Result
{
get
{
if (_myResult == null)
{
_myResult = Database.DoQueryForResult();
}
return _myResult;
}
}