He probado estas implementaciones
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;
}
Aquí están mis resultados de los tiempos de 100000 iteraciones en una cadena de ~ 25k. Más bajo es más rápido.
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, para mí, la implementación enumerador fue el más rápido para mí, por un grado significativo - 20% más rápido que la siguiente aplicación más cercana. Los resultados fueron repetibles, independientemente del orden en que se ejecutaron los métodos. También utilicé una fase de calentamiento para asegurar que los efectos transitorios (jit, etc.) fueron eliminados.
Ésta era una liberación de construcción (/ Optimizar +)
dónde viene la cadena viene? Supongo que ya que están preocupados por perf es una cadena grande? Si esta cadena grande proviene de un archivo o una llamada a un servicio web, entonces la pregunta debe ser "la forma más rápida de contar las nuevas líneas en una secuencia". La razón por la cual convertir todo en una cadena será costoso. – Simon
Por cierto, esto podría ser realmente un tonto de abril, no puedo decir más :-) –
Me preocupa la perforación porque # 1, es potencialmente grande (32k) y # 2, está siendo utilizada en un método OnPaint() en un control de Windows Forms. Por lo tanto, se llama * a menudo *. – Cheeso