为什么原生.net 4+字符串IndexOf比.net 3-慢

时间:2016-12-19 10:56:01

标签: c# .net

最近,我尝试编写一个简单的brutforce字符串搜索,并将其与性能中的本机.NET4实现进行比较。然而,我感到震惊,因为与原生的.NET 4+实现相比,我的自定义方法在某些方面具有x3性能提升。这一切都在发布模式下使用不同版本的.NET框架进行了测试。

不知何故,.NET 4+ String.IndexOf非常慢。所以我在旧的.NET 3-版本上进行了测试,发现本机实现的速度比最新的.NET版本要快。

以下是代码:http://pastebin.com/GB5w7FXz

它的要点是针对我的自定义方法测试大量本机方法:

private static int FindSubstringCustom(string text, string substring)
{
    int cachedTextLength = text.Length;
    int cachedSubstringLength = substring.Length;
    bool success = true;

    for (int i = 0; i < cachedTextLength; ++i)
    {
        if (text[i] == substring[0])
        {
            success = true;
            for (int j = 1; j < cachedSubstringLength; ++j)
            {
                if (text[i + j] != substring[j])
                {
                    success = false;
                    break;
                }
            }

            if (success)
            {
                return i;
            }
        }
    }

    return -1;
}

我使用Visual Studio 2015 Community Edition运行它。简单的控制台应用程序。

我仍然认为我犯了一些非常愚蠢的错字,但我找不到它。我的方法返回正确的结果也无济于事。

1 个答案:

答案 0 :(得分:-1)

对于3个测试中的2个(发布模式),您的代码慢于我的机器上的标准代码(对于.Net 4,.Net 4.6.1,.Net 3.5)。

另外请注意Microsoft的实现会做更多需要花费更多时间的事情:

  • 他们有很多输入验证(抛出ArgumentOutOfRangeExceptionArgumentNullException ....等等。这对测试代码有很大影响,因为它经常被执行数千次。
  • 他们考虑了文化
  • 他们有比较选项

为了它的价值,here is their current implementation。您可以使用自己的代码IMO做得更好。

相关问题