C#4.0,确定字符串长度的最有效方法!= 0?第2部分

时间:2010-08-02 18:32:50

标签: algorithm string c#-4.0 content-length processing-efficiency

(道歉,这是Most efficient way to determine if a string length != 0?的第二篇帖子,但我无法弄清楚如何回复人们的答案,我的回复会被贴上'回答')

理想情况下,我正在寻找的是执行以下操作的最有效算法(将被称为1亿次+次)。我正在使用C#4.0

转动字符串: “A B C D E” 进入数组: 字符串[ “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;
}

我的问题是,当我对100,000个字符串进行分析时,执行需要1.04秒。

如果我注释掉“if(split [i] .Length!= 0)”,那么只需0.2秒。

有人可以告诉我为什么对字符串的这个(简单)查询占用TOTAL执行时间的80%? (特别是,因为我期望其他领域使用更多的CPU)我唯一的想法就是C#试图计算字符串长度,人们告诉我不是这种情况(它更像是VB字符串我猜?)。但这对时间开销没有意义。

我考虑过试图看看split [i] [0]是否存在,但依赖异常会减慢WAAAAAAY的速度。

P.S。 - 我的算法也受到影响,返回的数组通常比它需要的更大,但这似乎不是太大的开销。

4 个答案:

答案 0 :(得分:3)

可能比你能做的更快或更快(没有进入低级代码,即C / C ++)。

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

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

答案 1 :(得分:2)

使用String.Split重载比较了性能,该重载采用会使空字符串检查不必要的StringSplitOptions吗?

答案 2 :(得分:1)

你可以直接替换

var split = text.Split(' ');

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

但这也应该被描述。

答案 3 :(得分:0)

当我对此进行基准测试时,无论是在调试模式还是发布模式下,无论“if(split [i] .Length!= 0)”是否存在,我都会获得几乎相同的运行时间,两者都对应于您最快的时间。 (因此支持长度是快速检查的想法。)是否有未显示的东西可能以其他方式影响性能?

话虽如此,我想同意StringSplitOptions.RemoveEmptyEntries是最好的方法。但我仍然很好奇为什么我不能重现原来的行为。