Does anyone know why C# (.NET)'s StartsWith function is considerably slower than IsPrefix?
I think it's mostly fetching the thread's current culture.
If you change Marc's test to use this form of 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);
it comes a lot closer.
If you use s1.StartsWith(s2, StringComparison.Ordinal)
it's a lot faster than using CompareInfo.IsPrefix
(depending on the CompareInfo
of course). On my box the results are (not scientifically):
Obviously that's because it's really just comparing 16 bit integers at each point, which is pretty cheap. If you don't want culture-sensitive checking, and performance is particularly important to you, that's the overload I'd use.