(道歉,这是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。 - 我的算法也受到影响,返回的数组通常比它需要的更大,但这似乎不是太大的开销。
答案 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是最好的方法。但我仍然很好奇为什么我不能重现原来的行为。