C# IndexOf等于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;

我正在编写一个非常简单的方法,该方法返回一个bool,用于判断给定字符串是否位于另一个字符串的位置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(返回真或假)运行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修改这个问题呢?顺便说一句:this
if(this.Length
似乎是的相关部分,所以是的,系统也会首先比较长度。这里有一个string.StartsWith(string)方法,顺便说一句。。。。。好吧,现在我觉得自己很笨。谢谢@TaWWell,既然你已经计时了,为什么不用StartsWith results修改这个问题呢?顺便说一句:this
if(this.Length
似乎是一个相关的部分,所以是的,系统也会首先比较长度。