Ist StreamReader.Readline () wirklich die schnellste Methode, um Zeilen in einer Datei zu zählen?

Während ich mich eine Weile umsah, fand ich einige Diskussionen darüber, wie man die Anzahl der Zeilen in einer Datei herausfindet.

Zum Beispiel diese drei:
Wie zähle ich Zeilen in einer Textdatei?
Bestimmen Sie die Anzahl der Zeilen in einer Textdatei
Wie zähle ich Linien schnell?

Also ging ich weiter und verwendete die effizienteste (zumindest in Bezug auf den Speicher?) Methode, die ich finden konnte:

private static int countFileLines(string filePath)
{
    using (StreamReader r = new StreamReader(filePath))
    {
        int i = 0;
        while (r.ReadLine() != null) 
        { 
            i++; 
        }
        return i;
    }
}

Dies dauert jedoch ewig, wenn die Zeilen selbst aus der Datei sehr lang sind. Gibt es dafür wirklich keine schnellere Lösung?

Ich habe versucht zu verwendenStreamReader.Read() oderStreamReader.Peek() Aber ich kann (oder kann nicht) nicht bewirken, dass einer von ihnen in die nächste Zeile wechselt, sobald es 'Zeug' gibt (Zeichen? Text?).

Irgendwelche Ideen bitte?

FAZIT / ERGEBNISSE (Nach einigen Tests basierend auf den angegebenen Antworten):

Ich habe die 5 unten aufgeführten Methoden an zwei verschiedenen Dateien getestet und dabei konsistente Ergebnisse erhalten, die auf ein einfaches Alter hinweisenStreamReader.ReadLine() ist immer noch einer der schnellsten Wege ... Ehrlich gesagt bin ich nach all den Kommentaren und Diskussionen in den Antworten ratlos.

Datei 1:
Größe: 3.631 KB
Linien: 56.870

Ergebnisse in Sekunden für Datei 1:
0.02 -> ReadLine-Methode.
0.04 -> Lesemethode.
0.29 -> ReadByte-Methode.
0.25 -> Readlines.Count-Methode.
0.04 -> ReadWithBufferSize-Methode.

Datei 2:
Größe: 14.499 KB
Zeilen: 213.424

Ergebnisse in Sekunden für Datei 1:
0.08 -> ReadLine-Methode.
0.19 -> Lesemethode.
1.15 -> ReadByte-Methode.
1.02 -> Readlines.Count-Methode.
0.08 -> ReadWithBufferSize-Methode.

Hier sind die 5 Methoden, die ich basierend auf dem erhaltenen Feedback getestet habe:

private static int countWithReadLine(string filePath)
{
    using (StreamReader r = new StreamReader(filePath))
    {
    int i = 0;
    while (r.ReadLine() != null)
    {
        i++;
    }
    return i;
    }
}

private static int countWithRead(string filePath)
{
    using (StreamReader _reader = new StreamReader(filePath))
    {
    int c = 0, count = 0;
    while ((c = _reader.Read()) != -1)
    {
        if (c == 10)
        {
        count++;
        }
    }
    return count;
    }            
}

private static int countWithReadByte(string filePath)
{
    using (Stream s = new FileStream(filePath, FileMode.Open))
    {
    int i = 0;
    int b;

    b = s.ReadByte();
    while (b >= 0)
    {
        if (b == 10)
        {
        i++;
        }
        b = s.ReadByte();
    }
    return i;
    }
}

private static int countWithReadLinesCount(string filePath)
{
    return File.ReadLines(filePath).Count();
}

private static int countWithReadAndBufferSize(string filePath)
{
    int bufferSize = 512;

    using (Stream s = new FileStream(filePath, FileMode.Open))
    {
    int i = 0;
    byte[] b = new byte[bufferSize];
    int n = 0;

    n = s.Read(b, 0, bufferSize);
    while (n > 0)
    {
        i += countByteLines(b, n);
        n = s.Read(b, 0, bufferSize);
    }
    return i;
    }
}

private static int countByteLines(byte[] b, int n)
{
    int i = 0;
    for (int j = 0; j < n; j++)
    {
    if (b[j] == 10)
    {
        i++;
    }
    }

    return i;
}

Antworten auf die Frage(7)

Ihre Antwort auf die Frage