0

(抱歉,这是确定字符串长度是否为 0 的最有效方法的第二篇文章?但我不知道如何回复人们的答案,我的回复被发布为“答案”)

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

将字符串:“ABCDE”转换为数组:string["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 秒。

谁能告诉我为什么对字符串的这个(简单)查询占用了总执行时间的 80%?(特别是,因为我希望其他领域使用更多的 CPU)我想出的唯一想法是 C# 试图计算字符串长度,人们告诉我不是这样(我猜它更像是 VB 字符串?)。但这对于时间开销来说是没有意义的。

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

PS——我的算法也受到影响,因为返回的数组通常比它需要的大,但这似乎并没有太大的开销。

4

4 回答 4

3

可能比您可以做的更快或更快(无需进入较低级别的代码,即 C/C++)。

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

//
public string[] SplitOnMultiSpaces(string text)
{
    return text.Split(splitter, StringSplitOptions.RemoveEmptyEntries );
}
于 2010-08-02T18:38:59.117 回答
2

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

于 2010-08-02T18:38:00.773 回答
1

你可以替换

var split = text.Split(' ');

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

但这也应该被描述。

于 2010-08-02T18:40:23.000 回答
0

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

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

于 2010-08-02T18:50:00.090 回答