Was ist der schnellste Weg, um eine Textdatei in eine Zeichenfolgenvariable einzulesen?
Ich verstehe, dass dies auf verschiedene Arten geschehen kann, z. B. indem einzelne Bytes gelesen und dann in Zeichenfolgen konvertiert werden. Ich suchte nach einer Methode mit minimaler Codierung.
Antworten:
Wie wäre es mit
File.ReadAllText
:quelle
StreamReader.ReadToEnd
ist effizienter.StreamReader.ReadToEnd
effizienter ist alsReadAllLines
. Was zu erwarten ist, da letztere den Text auch in Zeilen aufteilt. Wir sprechen aber von einer anderen MethodeReadAllText
. In der Tat zeigt die Antwort, die Sie erwähnen, dassReadAllText
nurStreamReader.ReadToEnd
intern angerufen wird.Ein Benchmark-Vergleich von
File.ReadAllLines
vsStreamReader ReadLine
aus C # -DateibehandlungStreamReader-Ansatz
Da der
File.ReadAllText
Ansatz von anderen vorgeschlagen wurde, können Sie ihn auch schneller ausprobieren (ich habe die Auswirkungen auf die Leistung nicht quantitativ getestet, aber er scheint schneller zu sein alsFile.ReadAllText
(siehe Vergleich unten)). Der Unterschied in der Leistung wird nur bei größeren Dateien jedoch sichtbar sein.Vergleich von File.Readxxx () mit StreamReader.Readxxx ()
Beim Anzeigen des indikativen Codes über ILSpy habe ich Folgendes gefunden
File.ReadAllLines
:File.ReadAllText
.File.ReadAllText
- WirdStreamReader.ReadToEnd
intern verwendetFile.ReadAllLines
- Verwendet auchStreamReader.ReadLine
intern mit dem zusätzlichen Aufwand, dieList<string>
als Lesezeilen zurückzugeben und bis zum Ende der Datei zu schleifen.Beide Methoden sind also eine zusätzliche Komfortschicht, die darauf aufbaut
StreamReader
. Dies wird durch den indikativen Körper der Methode deutlich.File.ReadAllText()
Implementierung wie von ILSpy dekompiliertquelle
File.ReadAllText
?File.ReadAllText()
einfach ein Wrapper istStreamReader.ReadToEnd()
. Ich vermute, dass die zusätzliche Ebene etwas langsamer als arbeiten sollteStreamReader.ReadToEnd()
.ReadAllText
es nur ein Wrapper iststreamReader.ReadToEnd();
?Hier ist die MSDN-Dokumentation
quelle
Schauen Sie sich File.ReadAllText () an -Methode an
Einige wichtige Bemerkungen:
quelle
string text = File.ReadAllText("Path");
Sie haben den gesamten Text in einer Zeichenfolgenvariablen. Wenn Sie jede Zeile einzeln benötigen, können Sie Folgendes verwenden:quelle
quelle
@Cris sorry. Dies ist ein Zitat
MSDN Microsoft
Methodik
In diesem Experiment werden zwei Klassen verglichen. Die
StreamReader
und dieFileStream
Klasse werden angewiesen, zwei Dateien mit 10 KB und 200 KB in ihrer Gesamtheit aus dem Anwendungsverzeichnis zu lesen.Ergebnis
FileStream
ist in diesem Test offensichtlich schneller. DasStreamReader
Lesen der kleinen Datei dauert zusätzlich 50% länger . Für die große Datei wurden zusätzlich 27% der Zeit benötigt.StreamReader
sucht gezielt nach Zeilenumbrüchen,FileStream
tut dies aber nicht. Dies wird einen Teil der zusätzlichen Zeit ausmachen.Empfehlungen
Abhängig davon, was die Anwendung mit einem Datenabschnitt tun muss, kann es zu einer zusätzlichen Analyse kommen, die zusätzliche Verarbeitungszeit erfordert. Stellen Sie sich ein Szenario vor, in dem eine Datei Datenspalten enthält und die Zeilen
CR/LF
begrenzt sind. DasStreamReader
würde in der Textzeile nach dem suchenCR/LF
und dann würde die Anwendung zusätzliche Analyse durchführen, um nach einem bestimmten Speicherort für Daten zu suchen. (Hast du gedacht, String. SubString kommt ohne Preis?)Auf der anderen Seite
FileStream
liest das die Daten in Blöcken und ein proaktiver Entwickler könnte etwas mehr Logik schreiben, um den Stream zu seinem Vorteil zu nutzen. Wenn sich die benötigten Daten an bestimmten Stellen in der Datei befinden, ist dies sicherlich der richtige Weg, da dadurch die Speichernutzung gering gehalten wird.FileStream
ist der bessere Mechanismus für die Geschwindigkeit, erfordert aber mehr Logik.quelle
StreamReader.ReadToEnd
?Nun, der schnellste Weg mit dem geringstmöglichen C # -Code ist wahrscheinlich der folgende:
quelle
Wenn Sie eine Datei aus dem Bin-Ordner der Anwendung auswählen möchten, können Sie Folgendes versuchen und die Ausnahmebehandlung nicht vergessen.
quelle
Sie können verwenden:
quelle
quelle
Für die Noobs da draußen, die dieses Zeug lustig und interessant finden, ist der schnellste Weg, eine ganze Datei in einen String zu lesen, in den meisten Fällen ( gemäß diesen Benchmarks ):
Das absolut schnellste Lesen einer Textdatei insgesamt scheint jedoch das Folgende zu sein:
Gegen mehrere andere Techniken hat es die meiste Zeit gewonnen, auch gegen den BufferedReader.
quelle
Sie können so verwenden
Hoffe das wird dir helfen.
quelle
Sie können einen Text aus einer Textdatei wie folgt in eine Zeichenfolge einlesen
quelle
quelle
Ich habe einen Vergleich zwischen einem ReadAllText und einem StreamBuffer für eine 2-MB-CSV durchgeführt, und es schien, dass der Unterschied recht gering war, aber ReadAllText schien die Oberhand von den Zeiten zu übernehmen, die für die Ausführung von Funktionen benötigt wurden.
quelle