我正在写一个非常简单的方法,它返回一个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毫秒。
答案 0 :(得分:2)
第二种方法效率更高,因为它包含2个条件,其中and
操作数具有第一个条件:stringToSearch.Length >= stringToMatch.Length
比第二个条件更有效率,因为它仅使用字符串长度,而第二个条件使用string.Substring
循环遍历整个string
长度,一次一个字符。由于在两个条件之间存在and
操作数,因此除非第一个条件返回true
,否则第二个条件不执行,因此整个if
子句变得更多效率更高。