Nun, ab .NET 5 (Net core 2.1+ & NetStandard 2.1) haben wir einen neuen König der Iterationsgeschwindigkeit.
"Span<T>" https://docs.microsoft.com/en-us/dotnet/api/system.span-1?view=net-5.0
und String hat ein eingebautes Mitglied, das uns einen Span<Char> zurückgibt
int count = 0;
foreach( var c in source.AsSpan())
{
if (c == '/')
count++;
}
Meine Tests zeigen, dass es 62 % schneller ist als ein Straight foreach. Ich habe auch einen Vergleich mit einer for()-Schleife auf einem Span<T>[i] angestellt, ebenso wie mit einigen anderen hier geposteten. Beachten Sie, dass die umgekehrte for()-Iteration auf einem String jetzt langsamer zu sein scheint als ein reines foreach.
Starting test, 10000000 iterations
(base) foreach = 673 ms
fastest to slowest
foreach Span = 252 ms 62.6%
Span [i--] = 282 ms 58.1%
Span [i++] = 402 ms 40.3%
for [i++] = 454 ms 32.5%
for [i--] = 867 ms -28.8%
Replace = 1905 ms -183.1%
Split = 2109 ms -213.4%
Linq.Count = 3797 ms -464.2%
UPDATE: Dezember 2021, Visual Studio 2022, .NET 5 & 6
.NET 5
Starting test, 100000000 iterations set
(base) foreach = 7658 ms
fastest to slowest
foreach Span = 3710 ms 51.6%
Span [i--] = 3745 ms 51.1%
Span [i++] = 3932 ms 48.7%
for [i++] = 4593 ms 40.0%
for [i--] = 7042 ms 8.0%
(base) foreach = 7658 ms 0.0%
Replace = 18641 ms -143.4%
Split = 21469 ms -180.3%
Linq = 39726 ms -418.8%
Regex Compiled = 128422 ms -1,577.0%
Regex = 179603 ms -2,245.3%
.NET 6
Starting test, 100000000 iterations set
(base) foreach = 7343 ms
fastest to slowest
foreach Span = 2918 ms 60.3%
for [i++] = 2945 ms 59.9%
Span [i++] = 3105 ms 57.7%
Span [i--] = 5076 ms 30.9%
(base) foreach = 7343 ms 0.0%
for [i--] = 8645 ms -17.7%
Replace = 18307 ms -149.3%
Split = 21440 ms -192.0%
Linq = 39354 ms -435.9%
Regex Compiled = 114178 ms -1,454.9%
Regex = 186493 ms -2,439.7%
Ich habe weitere Schleifen hinzugefügt und RegEx eingefügt, damit wir sehen können, was für eine Katastrophe es ist, es in vielen Iterationen zu verwenden. Ich denke, dass der for(++)-Schleifenvergleich in .NET 6 optimiert wurde, um Span intern zu verwenden - da er fast die gleiche Geschwindigkeit wie foreach span hat.
Code Link