0

(我的道歉,這是第二個帖子Most efficient way to determine if a string length != 0?但我無法弄清楚如何回答別人的答案,我的答覆變成張貼的「答案」)C#4.0,確定字符串長度!= 0的最有效方法?第2部分

理想情況下,我在尋找什麼因爲是進行以下操作的最有效的算法(將被稱爲1億次+)。我使用C#4.0

轉動字符串: 「ABCDE」 到陣列: 字符串[ 「A」, 「B」, 「C」, 「d」, 「E」]

我的算法如下:

public string[] SplitOnMultiSpaces(string text) 
{ 
    if (string.IsNullOrEmpty(text)) return new string[0]; 

    var split = text.Split(' '); 
    int length = split.Length; 

    var data = new string[length]; 

    int index = 0; 
    for (int i = 0; i<length; i++) 
    { 
    if (split[i].Length != 0) 
    { 
     data[index++] = split[i]; 
    } 
    } 

    return data; 
} 

我的問題是,當我資料這個反對100000個字符串,它需要1.04秒執行。

如果我註釋掉「if(split [i] .Length!= 0)」檢查,則只需要0.2秒。

有人可以告訴我爲什麼這個(簡單)查詢對字符串採取80%的TOTAL執行時間? (特別是,因爲我期望其他地區使用更多的CPU)我唯一的想法是C#正在試圖計算字符串長度,人們告訴我不是這種情況(它更像VB字符串我猜?)。但是這對於時間開銷是沒有意義的。

我考慮試圖看看split [i] [0]是否存在,但依靠異常會減慢WAAAAAAY的效果。

P.S. - 我的算法還受到這樣的影響,返回的數組通常比所需要的大,但這似乎不是太大的開銷。

+0

出於好奇,如果你關心速度,爲什麼你使用C#? C++或C可能會讓你顯着提高速度。 – riwalk 2010-08-02 18:34:18

+0

當您對其進行配置時,請確保Visual Studio未附加。它可能突然變得快了很多倍。 (或者它可能不會,那真的取決於。) – 2010-08-02 18:34:20

+4

要回復你需要點擊人員下面的小'添加評論'鏈接 – 2010-08-02 18:34:25

回答

2

使用String.Split重載比較了性能,該重載需要一個StringSplitOptions,這將使您的空字符串檢查不必要?

3

可能會比您可以做的更快或更快(無需進入低級代碼即C/C++)。

// somewhere else 
private static readonly char[] splitter = new []{' '} ; 

// 
public string[] SplitOnMultiSpaces(string text) 
{ 
    return text.Split(splitter, StringSplitOptions.RemoveEmptyEntries); 
} 
+1

+1用於直接返回分割結果並保存冗餘內存分配和副本。建議:使'new [] {''}'是一個靜態數組,而不是每次都'新建'。 – 2010-08-02 18:46:44

+0

@Moron好建議。 – 2010-08-02 18:52:58

1

你可以只更換

var split = text.Split(' '); 

var split = text.Split(' ', StringSplitOptions.RemoveEmptyEntries); 

然而,這也應該嚴密。

0

當我在調試模式或釋放模式下進行基準測試時,無論「if(split [i] .Length!= 0)」是否存在,都會得到幾乎相同的運行時間,這兩者對應於最快的時間。 (因此支持「長度」是一個快速檢查的想法。)有沒有顯示出可能以其他方式影響性能的東西?

說了這麼多,我想同意StringSplitOptions.RemoveEmptyEntries是最好的方法。但我仍然好奇爲什麼我不能重現原來的行爲。

相關問題