Performance bei QTextStream::readLine()

Alles rund um die Programmierung mit Qt
Antworten
iaby
Beiträge: 53
Registriert: 10. Februar 2007 13:12

Performance bei QTextStream::readLine()

Beitrag von iaby »

Hallo zusammen,

Wenn ich ein Textfile mit 20MB Größe über readLine() einlese, dann dauert das ca. 10 Sekunden.
Das gleiche über read() dauert hingegen nur etwa 0,7 Sekunden!
Ich brauche allerdings immer eine ganze Zeile! Kennt noch jemand einen Trick um das zu beschleunigen?
Wieso ist die Performance überhaupt so unterschiedlich? Bei read() prüft er eben auf ein Leerzeichen und bei readLine() auf einen Zeilenumbruch, dürfte doch eigentlich fast kein Unterschied machen, oder?

Gruß,
iaby
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Ohne Code kann man da nicht viel zu sagen. Und wieso prüft er bei read auf ein Leerzeichen? Du gibst doch an wieviel er lesen soll.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
iaby
Beiträge: 53
Registriert: 10. Februar 2007 13:12

Beitrag von iaby »

Ganz grob sieht das so aus:

Code: Alles auswählen

QFile file("/home/ich/test.txt");
file.open(QIODevice::ReadOnly | QIODevice::Text);
QString inString;
QTextStream in(&file);
in.setCodec("UTF-8");

while (!in.atEnd()) {
  inString = in.readLine();
}
wohingegen

Code: Alles auswählen

...
  inString = in.read();
...
viel schneller ist!

Liefert read() nicht einen String bis zum nächsten Leerzeichen zurück? Hatte ich so irgendwie im Kopf, in der Doku steht dazu aber tatsächlich nix ?: Der int-Wert der da übergeben wird verstehe ich so, dass es die maximale Anzahl Zeichen ist (also falls dann kein Leerzeichen zwischen drin auftaucht).
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Das erste sieht ok aus, beim zweiten fehlt mir der Parameter. Wie groß ist der denn? Die Doku lese ich so, das read(n) n Zeichen liest, egal was kommt. Wenn Du als n 1024 angegeben hast, dann ist er nach 20 Durchläufen fertig. Wenn da aber 1000 Zeilen drin stehen, dann dauert es eben 50mal länger.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
iaby
Beiträge: 53
Registriert: 10. Februar 2007 13:12

Beitrag von iaby »

Ja das stimmt laut Doku forder read(int) zwingend einen Parameter!
Ich schau mir das ganze nochmal an wenn ich wieder daheim bin. Bin mir aber relativ sicher dass ich read() ohne einen Parameter benutzt habe... :?
iaby
Beiträge: 53
Registriert: 10. Februar 2007 13:12

Beitrag von iaby »

Also read ohne Parameter liefert mir die ganze Datei zurück!
Werde ich wohl bei meinem readLine() bleiben müssen, obwohl mir das schon etwas zu langsam geht :?
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Wie sieht es denn aus wenn Du die ganze Datei liest und den String dann splittest? Könnte schneller sein, wenn Du den Zeilentrenner kennst. In den meisten Fällen sollte man mit '\n' zurecht kommen. Wenn es fühlbar schneller ist, solltest Du eine Dateigröße bestimmen bis zu der Du so verfährst.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
iaby
Beiträge: 53
Registriert: 10. Februar 2007 13:12

Beitrag von iaby »

Ja die Dateigröße ist eben dann mein Problem!
Wenn diese größer ist als das freie RAM, ist mein kompletter Vorteil dahin weil er auf die Festplatte auslagert!
Ich kann ja mal ein paar Test machen und alles kleiner als 10 - 50MB mit split() verarbeiten. Wobei er dann eben 2 * (10 - 50) MB benötigt!
Mal schauen, alles irgendwie nicht so optimal...
Antworten