IndexOf的背景等于0与子串等于

时间:2017-07-16 07:31:57

标签: c# substring equality indexof

我正在写一个非常简单的方法,它返回一个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(无论是返回true还是false)大约需要30 - 40 ms才能运行100,000次。 V2(无论是返回true还是false)大约需要5-8 ms才能运行100,000次。

这真让我感到惊讶。我所期望的是V1如果返回true则更好,因为它的操作较少(如果检查没有&&&);如果为false则V2会做得更好,因为V1会寻找整个字符串试图找到匹配V2不会。

有人可以解释为什么V2全面改善吗?

非常感谢!

编辑:根据下面的评论,我也测试了string.StartsWith。这种方法排在第二位,平均运行时间约为15毫秒。

1 个答案:

答案 0 :(得分:2)

第二种方法效率更高,因为它包含2个条件,其中and操作数具有第一个条件:stringToSearch.Length >= stringToMatch.Length比第二个条件更有效率,因为它仅使用字符串长度,而第二个条件使用string.Substring  循环遍历整个string长度,一次一个字符。由于在两个条件之间存在and操作数,因此除非第一个条件返回true ,否则第二个条件不执行,因此整个if子句变得更多效率更高。