gpt4 book ai didi

visual-studio - dotnet framework 4 中的字符串比较

转载 作者:行者123 更新时间:2023-12-04 03:42:47 25 4
gpt4 key购买 nike

我将解释我的问题(请原谅我的英语不好),我有一个 .NET exe,其中每毫秒的处理都非常重要。

这个程序做了很多字符串比较(大部分是 string1.IndexOf(string2, StringComparison.OrdinalIgnoreCase) )。

当我切换到框架 4 时,我的程序时间是以前的两倍。

我搜索了解释,发现函数IndexOf(s, OrdinalIgnoreCase)在框架 4 中要慢得多(我用一个简单的控制台应用程序进行了测试,并且在循环中,3.5 中的时间为 30 毫秒,4.0 中的时间为 210 毫秒???)。但是在当前文化中的比较在框架 4 中比 3.5 更快。

这是我使用的代码示例:

int iMax = 100000;
String str = "Mozilla/5.0+(Windows;+U;+Windows+NT+5.1;+fr;+rv:1.9.0.1)+Gecko/2008070208+Firefox/3.0.1";
Stopwatch sw = new Stopwatch();
sw.Start();
StringComparison s = StringComparison.OrdinalIgnoreCase;
for(int i = 1;i<iMax;i++)
{
str.IndexOf("windows", s);
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
Console.Read();

我的问题是:
  • 有没有人注意到同样的问题?
  • 有人对这种变化有解释吗?
  • 有没有办法绕过这个问题?

  • 谢谢。

    最佳答案

    好的,我回答了我的一个问题。

    使用反射器,我可以看到框架 2 和框架 4 之间的区别,这解释了我的性能问题。

        public int IndexOf(string value, int startIndex, int count, StringComparison comparisonType)
    {
    if (value == null)
    {
    throw new ArgumentNullException("value");
    }
    if ((startIndex < 0) || (startIndex > this.Length))
    {
    throw new ArgumentOutOfRangeException("startIndex", Environment.GetResourceString("ArgumentOutOfRange_Index"));
    }
    if ((count < 0) || (startIndex > (this.Length - count)))
    {
    throw new ArgumentOutOfRangeException("count", Environment.GetResourceString("ArgumentOutOfRange_Count"));
    }
    switch (comparisonType)
    {
    case StringComparison.CurrentCulture:
    return CultureInfo.CurrentCulture.CompareInfo.IndexOf(this, value, startIndex, count, CompareOptions.None);

    case StringComparison.CurrentCultureIgnoreCase:
    return CultureInfo.CurrentCulture.CompareInfo.IndexOf(this, value, startIndex, count, CompareOptions.IgnoreCase);

    case StringComparison.InvariantCulture:
    return CultureInfo.InvariantCulture.CompareInfo.IndexOf(this, value, startIndex, count, CompareOptions.None);

    case StringComparison.InvariantCultureIgnoreCase:
    return CultureInfo.InvariantCulture.CompareInfo.IndexOf(this, value, startIndex, count, CompareOptions.IgnoreCase);

    case StringComparison.Ordinal:
    return CultureInfo.InvariantCulture.CompareInfo.IndexOf(this, value, startIndex, count, CompareOptions.Ordinal);

    case StringComparison.OrdinalIgnoreCase:
    return TextInfo.IndexOfStringOrdinalIgnoreCase(this, value, startIndex, count);
    }
    throw new ArgumentException(Environment.GetResourceString("NotSupported_StringComparison"), "comparisonType");
    }

    这是2框架的IndexOf函数的基础代码(4和2没有区别)

    但是在函数 TextInfo.IndexOfStringOrdinalIgnoreCase 中存在差异:

    框架 2 :
        internal static unsafe int IndexOfStringOrdinalIgnoreCase(string source, string value, int startIndex, int count)
    {
    if (source == null)
    {
    throw new ArgumentNullException("source");
    }
    return nativeIndexOfStringOrdinalIgnoreCase(InvariantNativeTextInfo, source, value, startIndex, count);
    }

    框架 4:
        internal static int IndexOfStringOrdinalIgnoreCase(string source, string value, int startIndex, int count)
    {
    if ((source.Length == 0) && (value.Length == 0))
    {
    return 0;
    }
    int num = startIndex + count;
    int num2 = num - value.Length;
    while (startIndex <= num2)
    {
    if (CompareOrdinalIgnoreCaseEx(source, startIndex, value, 0, value.Length, value.Length) == 0)
    {
    return startIndex;
    }
    startIndex++;
    }
    return -1;
    }

    框架 2 中的主要算法已更改,调用的是已从框架 4 中删除的 nativeDll。
    很高兴知道

    关于visual-studio - dotnet framework 4 中的字符串比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3771030/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com