Ответ 1
Я тестировал эти реализации
private static int Count1(string s)
{
int len = s.Length;
int c = 0;
for (int i=0; i < len; i++)
{
if (s[i] == '\n') c++;
}
return c+1;
}
private static int Count2(string s)
{
int count = -1;
int index = -1;
do
{
count++;
index = s.IndexOf('\n', index + 1);
}
while (index != -1);
return count+1;
}
private static int Count3(string s)
{
return s.Count( c => c == '\n' ) + 1;
}
private static int Count4(string s)
{
int n = 0;
foreach( var c in s )
{
if ( c == '\n' ) n++;
}
return n+1;
}
private static int Count5(string s)
{
var a = s.ToCharArray();
int c = 0;
for (int i=0; i < a.Length; i++)
{
if (a[i]=='\n') c++;
}
return c+1;
}
Вот мои результаты синхронизации для 100000 итераций в строке ~ 25k. Нижний - быстрее.
Time Factor
Count1 4.8581503 1.4
Count2 4.1406059 1.2
Count3 45.3614124 13.4
Count4 3.3896130 1.0
Count5 5.9304543 1.7
Удивительно, но для меня реализация Enumerator была самой быстрой для меня, в значительной степени - на 20% быстрее, чем следующая ближайшая реализация. Результаты повторялись, независимо от порядка, в котором выполнялись методы. Я также использовал фазу разминки, чтобы обеспечить переходные эффекты (jit и т.д.), Были учтены.
Это было для сборки релиза (/optimize +)