ho provato queste implementazioni
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;
}
Qui ci sono i miei risultati di temporizzazione per 100000 iterazioni su una serie di ~ 25k. Più basso è più veloce.
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
Sorprendentemente, per me, l'attuazione Enumeratore stato il più veloce per me, da un grado significativo - 20% più veloce rispetto a quello successivo più vicino implementazione. I risultati sono stati ripetibili, indipendentemente dall'ordine in cui sono stati eseguiti i metodi. Ho anche usato una fase di riscaldamento per assicurare effetti transitori (jit, ecc.).
Questo era per una versione di build (/ optimize +)
Da dove viene la stringa? Suppongo che dal momento che si parla di perf è una grande stringa? Se questa stringa di grandi dimensioni proviene da un file o da una chiamata al servizio web, la domanda deve essere "il modo più rapido per contare le nuove righe in un flusso". Il motivo per cui si converte l'intera stringa in una stringa sarà costoso. – Simon
BTW, questo potrebbe davvero essere un pesce d'aprile, non posso dirlo più :-) –
Sono preoccupato per il fatto che il primo è potenzialmente grande (32k) e # 2, è usato in un metodo OnPaint() in un controllo Windows Form. Quindi è chiamato * spesso *. – Cheeso