2009-01-28 92 views
8

我想知道现在人们经常使用什么样的优化技术。我看到人们总是用字典和所有东西来缓存。速度的交易空间是唯一的出路吗?C#中的优化技巧

+0

您能更具体地了解您想要的场景吗? “优化”是一个非常广泛的范畴。 – Larsenal 2009-01-28 00:53:41

+0

是的,广泛的方式。你有具体的问题吗? – 2009-01-28 00:56:10

+0

只是想知道是否有任何方法来优化代码,而不是使用字典缓存。 – Tom 2009-01-28 01:19:51

回答

2

取决于很多事情,真的。

作为一个例子,当内存成为问题并且很多临时对象正在创建时,我倾向于使用对象池。 (有一个垃圾收集器不是没有照顾内存分配的理由)。如果速度是至关重要的,那么我可能会使用不安全的指针来处理数组。无论哪种方式,如果您发现自己在c#/。net应用程序中使用优化技术挣扎得太多,您可能选择了错误的语言/平台。

1

一般来说,请确保您了解不同算法的时间复杂性,并使用该知识明智地选择您的实施。

对于.NET而言,本文将详细介绍如何优化部署到CLR的代码(尽管它也适用于Java或任何其他现代平台),并且是我阅读过的最佳指南之一:

http://msdn.microsoft.com/en-us/library/ms973852.aspx

提炼出文章成一句话:没有什么影响.NET应用程序的不是它的对象的内存占用更多​​的速度(与合理的算法)。要非常小心地减少你的内存消耗。

4

算法也常常会遇到问题,通常是在循环内部完成一些昂贵的操作时。一般来说,你要做的第一件事是分析你的应用程序,它会告诉你应用程序的最慢部分。一般来说,你做什么来加快你的应用程序取决于你找到的。例如,如果您的应用程序模仿文件系统,则可能是您正在递归地调用数据库以传播树(例如)。您可以通过将这些递归调用更改为一次展开的数据库调用来优化该情况,该调用将返回一次调用中的所有数据。

同样,答案与往常一样,“取决于”。然而,更多的例子和建议可以在Rico Mariani's blog(回顾几年,因为他的焦点已经转移)中找到:

+0

分析您的具体应用程序可能是唯一的好建议。配置文件,看看什么是缓慢的(或内存占用),并试图减少它。 – Kibbee 2009-01-28 02:15:21

3

真的这是关于你的算法选择。通常没有优化的“银弹”。

例如,使用StringBuilder而不是串联可以使您的代码显着更快,但是存在折衷。如果您没有串联大量字符串,则初始化StringBuilder所需的内存和时间比仅使用常规级联更差。在整个框架中有很多这样的例子,比如你在问题中提到的字典缓存。

只有一般的优化,你真的可以学习并适用于你的编码整个一天是从拳击/拆箱(堆与堆栈)的性能打击。要做到这一点,你需要了解它是什么和如何避免,或减少需要做到这一点。

微软的MSDN文档有2篇关于性能的文章,它们提供了很多很好的通用技术(它们实际上只是同一篇文章的不同版本)。

1

我会被比尔·瓦格纳(first editionsecond edition)建议有效的C#。他经历了许多语言结构和技巧,并解释了哪些更快,为什么。他也涉及了很多最佳实践。

然而,经常优化您的算法会比使用任何一种语言/优化技术带给您更好的结果。

2

我会建议以下

1.知道什么时候使用StringBuilder的

你一定听说过,一个StringBuilder对象以非正常字符串类型的附加串起来要快得多。

The thing is StringBuilder is faster mostly with big strings. This means if you have a loop that will add to a single string for many iterations then a StringBuilder class is definitely much faster than a string type. However if you just want to append something to a string a single time then a StringBuilder class is overkill. A simple string type variable in this case improves on resources use and readability of the C# source code.

简单的StringBuilder对象和字符串类型,你可以优化你的代码之间的正确选择。

2.比较不区分大小写字符串

在应用中有时需要两个字符串变量比较,忽略了案件。诱人的和传统的方法是两个字符串转换为小写或全部大写,然后对它们进行比较,就像这样:

str1.ToLower() == str2.ToLower()

但是反复调用ToLower将()的函数是在服务表现的瓶颈。通过改为使用内置的string.Compare()函数,可以提高应用程序的速度。

要检查两个字符串相等忽略大小写应该是这样的:

string.Compare(str1, str2, true) == 0 //Ignoring cases

的C#string.Compare函数返回一个整数,当两个字符串相等等于0。

3.使用的String.Empty

这与其说是一个性能改进,因为它是一个可读性的改进,但它仍然算作代码优化。试图取代线,如:

if (str == "")

有:

if (str == string.Empty)

这仅仅是良好的编程习惯和对性能没有负面影响。

请注意,检查字符串长度为0的流行做法比将其与空字符串进行比较的速度更快。虽然这可能是真的,一旦它不再是一个重大的性能改进。而是坚持使用string.Empty。

4.更换的ArrayList与列表中的同一列表内存储多个类型的对象时<>

ArrayList中是有用的。但是,如果您将同一类型的变量保存在一个ArrayList中,则可以使用List <>对象来提高性能。

看看下面的ArrayList:

ArrayList intList = new ArrayList(); 
intList.add(10); 
return (int)intList[0] + 20; 

注意到它仅包含intergers。使用列表<>类更好。将其转换为一个类型列表,只需要在变量类型改变:

List<int> intList = new List<int>(); 

intList.add(10) 

return intList[0] + 20; 

没有必要用列表<投类型>。使用像整数这样的基本数据类型,性能提升可能会特别显着。

5.使用& &和||运营商

当建立if语句,只需确保使用双和符号(& &)和/或双或符号(||),(在Visual Basic中,他们是AndAlso和OrElse运算)。

如果使用&和|必须检查声明的每个部分,然后应用“和”或“或”。另一方面,& &和||一次只读一次,一旦条件满足或不满足,就停止。

执行较少的代码始终是一个服务表现好处,但也可避免运行时错误,请考虑下面的C#代码:

if (object1 != null && object1.runMethod()) 

如果object1为null,与& &操作,object1.runMethod( )不会执行。如果& &运算符被替换为&,即使object1已知为空,导致异常,object1.runMethod()将运行。

6.智能的try-catch

的try-catch语句是为了捕捉异常,超出程序员控制,例如连接到网络或例如一个设备。使用try语句来保持代码“简单”而不是使用if语句来避免容易出错的调用,这使代码变得非常慢。重构您的源代码以减少需要的try语句。

7.更换部门

C#是当它涉及到除法运算速度相对较慢。一种替代方法是用乘法移位操作替换分区以进一步优化C#。文章详细解释了如何进行转换。

REFERENCE