2008-11-15 105 views
3

哪個更快?這:c#性能:類型比較與字符串比較

bool isEqual = (MyObject1 is MyObject2) 

或者這樣:

bool isEqual = ("blah" == "blah1") 

這將有助於找出哪一個更快。顯然,如果你像程序員經常做的那樣將.ToUpper()應用到字符串比較的每一側,那就需要重新分配影響性能的內存。但是如果.ToUpper()與上面的示例中的等式不同,那麼該怎麼辦?

回答

4

第一個用於比較類型而不是值。 如果你想比較非敏感字符串的情況下,你可以使用:


     string toto = "toto"; 
     string tata = "tata"; 
     bool isEqual = string.Compare(toto, tata, StringComparison.InvariantCultureIgnoreCase) == 0;  
     Console.WriteLine(isEqual);  
5

據該書最大化.NET性能 通話

bool isEqual = String.Equals("test", "test"); 

在性能上等同於

bool isEqual = ("test" == "test"); 

致電

bool isEqual = "test".Equals("test"); 

在理論上比調用靜態String.Equals方法要慢,但我認爲您需要比較幾百萬個字符串才能真正檢測速度差異。

我的建議是這樣的;不要擔心哪個字符串比較方法更慢或更快。在一個正常的應用程序中,你將永遠不會注意到這種差異你應該用你認爲最具可讀性的方式。

+0

是Nicholas J. Wienholt的作者?你會認爲這是一個推薦閱讀? – JSWork 2011-05-02 21:04:31

0

與「==」操作符比較字符串比較內容的字符串與字符串對象參考。比較對象將調用對象的「Equals」方法來確定它們是否相等。 Equals的默認實現是進行參考比較,如果兩個對象引用是相同的物理對象,則返回True。這可能會比字符串比較更快,但取決於被比較的對象的類型。

9

我在這裏有點困惑。

正如其他答案已經指出,你正在比較蘋果和橘子。 ::rimshot::

如果要確定對象是否屬於某種類型,請使用is運算符。

如果您想比較字符串,請使用==運算符(或其他適當的比較方法,如果您需要像大小寫不區分大小寫的比較)。

一個操作與另一個操作相比有多快(無雙關語)似乎並不重要。


仔細閱讀後,我認爲,要串comparisions的速度與基準比較的速度(在System.Object的基本類型中使用的比較類型)進行比較。

如果是這樣,那麼答案是參考比較決不會比任何其他字符串比較慢。 .NET中的參考比較與C中的指針比較非常類似 - 大概可以得到。

但是,你怎麼會覺得如果一個字符串變量s的值爲"I'm a string",但下面的比較失敗:

if (((object) s) == ((object) "I'm a string")) { ... } 

如果單純比較基準,即可能發生的事情取決於s值是如何創建。如果最終沒有被執行,它將不會與文字字符串具有相同的引用,所以比較會失敗。所以你可能有一個更快的比較,並不總是奏效。這似乎是一個糟糕的優化。

+3

其他答案已經錯過了關鍵點,即「is」操作符不會像提問者認爲的那樣做任何事情。 – 2008-11-15 01:48:47

0

我假設比較你的第一個例子中的對象的速度要快,因爲它只是檢查兩個對象是否指向內存中的相同地址。

正如已經多次提到過的那樣,也可以比較字符串上的地址,但如果兩個字符串是從不同的來源分配的,則這不一定有效。

最後,它通常是很好的形式,只要有可能,就嘗試和比較基於類型的對象。它通常是最具體的識別方法。如果你的對象需要用內存中的地址以外的東西來表示,那麼可以使用其他屬性作爲標識符。

+0

你錯過了「is」運算符的含義,我想呢? – 2009-12-28 10:48:39

0

如果我沒有理解這個問題,你真的比較基準平等普通的老「比較內容」:建立一個測試用例,並呼籲object.ReferenceEquals反對== B的情況。

注意:您的以瞭解它們之間的區別,並且您可能無法在大多數情況下使用參考比較。如果你確定這是你想要的,可能快一點。你必須自己嘗試一下,並評估這是否值得麻煩。