.NET Core 2.1でstring.StartsWithが遅くなることがある話

このエントリーをはてなブックマークに追加

個人的にstring.StartsWith系統どれが一番早いの選手権開きたかったので、いろいろと計測していたのですが、どうも .NET Core 2.1だけ異常に遅い場合があるという発見をしたのでメモです。


計測したのはいつも通りBenchmarkDotNetです。 計測対象は以下のコード

        private readonly string text = "text is big title";

        [Benchmark]
        public bool StartsWithDefaultOfEqualText()
        {
            return text.StartsWith(text);
        }

        [Benchmark]
        public bool StartsWithOrdinalOfEqualText()
        {
            return text.StartsWith(text, StringComparison.Ordinal);
        }

        [Benchmark]
        public bool StartsWithDefault()
        {
            return text.StartsWith("text is big");
        }

        [Benchmark]
        public bool StartsWithOrdinal()
        {
            return text.StartsWith("text is big", StringComparison.Ordinal);
        }

カルチャー指定と、比較元と比較対象が同じ場合の4パターンです。 結果:

BenchmarkDotNet=v0.10.14, OS=Windows 10.0.17134
Intel Core i7-6700 CPU 3.40GHz (Skylake), 1 CPU, 8 logical and 4 physical cores
Frequency=3328120 Hz, Resolution=300.4699 ns, Timer=TSC
.NET Core SDK=2.1.300
[Host] : .NET Core 2.1.0 (CoreCLR 4.6.26515.07, CoreFX 4.6.26515.06), 64bit RyuJIT
Job-DEECUJ : .NET Core 2.0.7 (CoreCLR 4.6.26328.01, CoreFX 4.6.26403.03), 64bit RyuJIT
Job-OOSFQU : .NET Core 2.1.0 (CoreCLR 4.6.26515.07, CoreFX 4.6.26515.06), 64bit RyuJIT
Clr : .NET Framework 4.7.1 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.7.3131.0

結果としては、.NET Core 2.0, 2.1と .NET Framework 4.7の中で、比較元と比較対象が同じであるならば .NET Core 2.1が異常に遅い。
同じでない場合で、計測したような文字列であれば .NET Core 2.0が一番早いという感じでした。
もちろん、値に何を指定にするかで速度とかは変わってきますが、今回計測した文字列ではこうなった感じです。
個人的に .NET Core 2.1すごく早くなったなーっと思ってたところにこの計測結果が出て少し残念ですね。