2009-01-28 138 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