【问题标题】:Background of IndexOf equals 0 vs Substring equalsIndexOf 的背景等于 0 vs Substring 等于
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多