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是最好的方法。但我仍然好奇为什么我不能重现原来的行为。

相关问题