C# IndexOf等于0的背景与子字符串等于
我正在编写一个非常简单的方法,该方法返回一个bool,用于判断给定字符串是否位于另一个字符串的位置0。在设计时,我想到了两种不同的设计,它们可以做同样的事情:C# IndexOf等于0的背景与子字符串等于,c#,substring,equality,indexof,C#,Substring,Equality,Indexof,我正在编写一个非常简单的方法,该方法返回一个bool,用于判断给定字符串是否位于另一个字符串的位置0。在设计时,我想到了两种不同的设计,它们可以做同样的事情: private static bool IsAtPositionZeroV1(string stringToSearch, string stringToMatch) { if (stringToSearch.IndexOf(stringToMatch) == 0) return true;
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(返回真或假)运行100000次大约需要30-40毫秒。
V2(返回真或假)运行100000次大约需要5-8毫秒
这真让我吃惊。我所期望的是,如果返回true,V1会更好,因为它有更少的操作(if检查中的no&&操作),如果返回false,V2会更好,因为V1会搜索整个字符串以试图找到匹配项,而V2不会
有人能解释为什么V2在所有方面都好得多吗
多谢
编辑:根据下面的注释,我还测试了string.StartsWith。此方法在100000次运行中以平均约15毫秒的速度排在第二位。第二种方法效率更高,因为它包含两个带有
的条件和带有第一个条件的操作数:stringToSearch.Length>=stringToMatch.Length
比第二种条件更有效,因为它只使用字符串长度,而第二个条件使用string.Substring
循环遍历整个字符串
长度,每次一个字符。由于这两个条件之间有一个和操作数,因此除非第一个条件返回true
,否则不会执行第二个条件,因此,整个if
子句变得更加高效。第二个方法效率更高,因为它包含两个条件,其中一个条件为,另一个条件为操作数:stringToSearch.Length>=stringToMatch.Length
比第二个条件效率更高,因为它只使用字符串长度,而第二个条件使用的是string.Substring
循环遍历整个字符串
长度,每次一个字符。由于两个条件之间有一个和操作数,除非第一个条件返回true
,否则不会执行第二个条件,因此整个if
子句的效率要高得多。有一个string.StartsWith(string)方法,顺便说一句。。。。。好吧,现在我觉得自己很笨。谢谢@TaWWell,既然你已经计时了,为什么不用StartsWith results修改这个问题呢?顺便说一句:thisif(this.Length
似乎是的相关部分,所以是的,系统也会首先比较长度。这里有一个string.StartsWith(string)方法,顺便说一句。。。。。好吧,现在我觉得自己很笨。谢谢@TaWWell,既然你已经计时了,为什么不用StartsWith results修改这个问题呢?顺便说一句:thisif(this.Length
似乎是一个相关的部分,所以是的,系统也会首先比较长度。