個人的に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すごく早くなったなーっと思ってたところにこの計測結果が出て少し残念ですね。