有谁知道为什么C#(.NET)的StartsWith函数比IsPrefix慢得多?

最佳答案

我认为这主要是在获取线程的当前文化。

如果您更改Marc的测试以使用这种形式的String.StartsWith:

    Stopwatch watch = Stopwatch.StartNew();
    CultureInfo cc = CultureInfo.CurrentCulture;
    for (int i = 0; i < LOOP; i++)
    {
        if (s1.StartsWith(s2, false, cc)) chk++;
    }
    watch.Stop();
    Console.WriteLine(watch.ElapsedMilliseconds + "ms; chk: " + chk);

离它更近了。

如果使用s1.StartsWith(s2, StringComparison.Ordinal),则比使用CompareInfo.IsPrefix快得多(当然,这取决于CompareInfo)。在我的盒子上,结果是(并非科学地):
  • s1.StartsWith(s2):6914ms
  • s1.StartsWith(s2,false,culture):5568ms
  • compare.IsPrefix(s1,s2):5200ms
  • s1.StartsWith(s2,StringComparison.Ordinal):1393毫秒

  • 显然这是因为它实际上只是比较每个点的16位整数,这非常便宜。如果您不希望进行文化敏感的检查,而性能对您尤为重要,那就是我要使用的重载。

    关于.net - 为什么函数isprefix比C#中的Startswith更快?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/717855/

    10-11 16:27