2010-09-06 86 views
3

嘿傢伙我要讀它由超過300萬條記錄和超過1000萬的嵌套元素C#中的字符串性能 - 什麼是更快地比較,字符串文字或字符串長度

自然我使用XmlTextReader的一個巨大的XML文件並採用多種優化技巧和提示

有我的分析時間縮短到40秒左右從早期90秒,但我想,以進一步節省處理時間,盡我所能,因此下面的問題

不少元素類型爲xs:boolean並且數據提供程序始終將值表示爲「true」或「false」 - 從不「1」或「0」

對於這種情況我最早的代碼是:

if (xmlTextReader.Value == "true") 
{ 
    bool subtitled = true; 
} 

我進一步優化:

if (string.Equals(xmlTextReader.Value, "true", StringComparison.OrdinalIgnoreCase)) 
{ 
    bool subtitled = true; 
} 

我想知道如果跌破將是最快的(因爲它不是「對或錯」)?

if (xtr.value.length == 4) 
{ 
    bool subtitled = true; 
} 
+0

你爲什麼不以這兩種方法爲基準並親眼看看? (對於它的價值,我猜測長度比較會更快,但可能並不顯着。) – LukeH 2010-09-06 14:00:48

+1

爲什麼不只是測試它?我不會感到驚訝,如果string.Equals短路無論如何它是測試長度比較。它會檢查第一個參考是否相等,然後是兩個字符串的長度,然後如果長度相同,則執行逐字符測試。只是一個猜測。 – 2010-09-06 14:03:33

+1

@Chris Taylor:'Equals'只爲'Ordinal'和'OrdinalIgnoreCase'做了這個短路。在所有其他中,「\ x00e9」.Equals(「e \ x0301」)「儘管長度不同,但是是正確的。 – Timwi 2010-09-06 14:20:00

回答

7

是的,速度更快,因爲您只比較一個值,即字符串的長度。

通過比較兩個字符串,可以比較每個字符,只要兩個字符相同即可。因此,如果您找到字符串"true"的匹配項,那麼在謂詞求值爲true之前,您將進行4次比較。

這個解決方案的唯一問題是,如果有一天價值將從true變爲1,那麼您將在這裏遇到問題。

+2

這實際上並不是一個問題:當「1」!=「true」和「0」!=「false」時,你會有相同的失敗比較。你不能改變一半的接口實現,並期望接口和該接口的所有其他實現奇蹟般地改變。另請參閱波斯特爾定律:對你發送的內容保守;在你接受的東西中自由自在。 – MSalters 2010-09-06 14:52:20

+0

@Msalters,但「1」的長度和「0」的長度是相同的,所以您無法根據長度確定值。 – 2010-09-06 15:01:24

+0

但它比xmlTextReader.Value [0] =='t'更快嗎?只是想提出原因的問題是基準 – 2010-09-06 15:04:00

4

比較長度會更快,但可讀性更差。我不會使用它,除非我描述代碼的性能,並得出結論說我需要這種優化。

0

不能只寫一個單元測試嗎?例如運行每個場景1000次並比較日期時間。

2

測量長度幾乎總是會更快。這就是說,除非這是一個微優化的實驗,否則我只關注使代碼可讀並傳達適當的語義。

您也可以嘗試類似的東西使用以下方法:

Boolean.TryParse(xmlTextReader.Value, out subtitled) 

我知道,無關你的問題,但我想我會扔在那裏呢。

3

將第一個字符與「t」比較怎麼辦?

應該(也許:)比整個字符串比較快..

-1

字符串比較和分析是.NET中很慢,我建議避免使用密集字符串解析/ NET中的比較。

如果您被迫這樣做 - 使用高度優化的非託管或不安全的代碼並使用並行性。

恕我直言。

+0

任何支持此聲明的鏈接? – FuleSnabel 2010-09-06 16:40:41

+1

-1:在上下文之外,或者尤其是在這種情況下,這種說法已經有問題了。但即使有懷疑,遺憾,但沒有任何證據/事實/經驗,這只不過是FUD。 – 2010-09-07 10:37:27

+0

只需編寫簡單的測試並自己查看。我做的。 例如,在c/C++和c#中編寫字符串比較,字符訪問,例如atoi()和Convert.ToInt32(),您將看到本機非託管代碼的效率提高數百倍。 – 2010-09-07 11:57:49

0

如果您知道它是「真」還是「假」,則最後一個片段必須是最快的。

無論如何,你也可以這樣寫:

bool subtitled = (xtr.Value.length == 4); 

這應該是更快的。