【发布时间】:2017-07-16 07:31:56
【问题描述】:
我正在编写一个非常简单的方法,它返回一个布尔值来判断给定字符串是否位于另一个字符串的位置 0。在设计这个时,我想出了两种不同的设计来做同样的事情:
private static bool IsAtPositionZeroV1(string stringToSearch, string stringToMatch)
{
if (stringToSearch.IndexOf(stringToMatch) == 0) return true;
return false;
}
private static bool IsAtPositionZeroV2(string stringToSearch, string stringToMatch)
{
if (stringToSearch.Length >= stringToMatch.Length && stringToSearch.Substring(0, stringToMatch.Length) == stringToMatch) return true;
return false;
}
我调用这个函数数十万次,所以从长远来看,即使是很小的性能差异也可能是显着的。我多次对这两种方法进行了 100000 次测试,发现了这些结果:
V1(无论返回 true 还是 false)运行 100,000 次大约需要 30 - 40 ms。 V2(无论返回 true 还是 false)运行 100,000 次大约需要 5 - 8 ms。
这真的让我很惊讶。我所期望的是,如果返回 true,V1 会更好,因为它的操作更少(在 if 检查中没有 &&),而如果返回 false,V2 会做得更好,因为 V1 会寻找整个字符串以试图找到匹配项,而 V2 不会.
有人能解释一下为什么 V2 整体上要好得多吗?
非常感谢!
编辑:根据下面的评论,我还测试了 string.StartsWith。该方法以平均约 15 毫秒运行 100,000 次,排名第二。
【问题讨论】:
-
有一个 string.StartsWith(string) 方法,顺便说一句..
-
...好吧,现在我觉得自己很笨。谢谢@TaW
-
好吧,既然你已经计时了,为什么不用 StartsWith 结果修改问题呢?
-
顺便说一句:这个
if( this.Length < value.Length) { return false; } return (TextInfo.CompareOrdinalIgnoreCaseEx(this, 0, value, 0, value.Length, value.Length) == 0);似乎是c# source implementation 的相关部分,所以是的,系统也会首先比较长度。
标签: c# substring equality indexof