Seien Sie vorsichtig. Es gibt viele Effekte zu beachten.
Für die betreffende String-Verarbeitung (oder was auch immer Sie mit der Datei machen) gibt es wahrscheinlich keinen Leistungsunterschied zwischen dem Speichern aus einer Datei zeilenweise, vorausgesetzt, dass die Dateipufferung sinnvoll ist.
Wenn Sie Ihr Betriebssystem aufrufen, um ein Low-Level-Lesen durchzuführen, ist es sehr teuer. Deshalb haben wir I/O gepuffert. Bei kleinen E/A-Größen dominiert der Overhead des Anrufs. So ist das Lesen von 64 Bytes wahrscheinlich 1/4 so effizient wie das Lesen von 256 Bytes gleichzeitig. (Und ich spreche von read() hier, nicht fgets() oder fread() beide gepuffert sind.)
Zu einem bestimmten Zeitpunkt beginnt die Zeit für die physische I/O beginnt zu dominieren, und wenn die Leistung steigt nicht viel für einen größeren Puffer haben Sie Ihre Puffergröße gefunden. Sehr alter Datenpunkt: 7MHz Amiga 500, 100MB SCSI-Festplatte (A590 + Quantum): Meine I/O-Performance hat mit einer 256KB-Puffergröße wirklich nur das Maximum erreicht. Verglichen mit dem Prozessor war diese Festplatte SCHNELL !!! (Der Computer hatte nur 3 MB RAM. 256 KB ist ein großer Puffer!)
Allerdings können Sie zu viel von einer guten Sache haben. Sobald sich Ihre Datei im Speicher befindet, kann das Betriebssystem diese Datei nach Belieben auf die Festplatte zurücksenden. Und wenn dies der Fall ist, haben Sie den Vorteil der Pufferung verloren. Wenn Sie Ihre Puffer zu groß machen, kann dies unter bestimmten Belastungssituationen passieren und Ihre Leistung geht auf die Toilette. Berücksichtigen Sie daher Ihre Laufzeitumgebung sorgfältig und begrenzen Sie bei Bedarf den Speicherbedarf.
Eine Alternative ist die Verwendung von mmap(), um die Datei in den Speicher abzulegen. Jetzt wird das OS Ihre Datei nicht mehr pagen - es wird einfach nicht eingefügt, oder wenn es Speicher benötigt, wird es alle Teile der Datei, die im Core zwischengespeichert sind, verwerfen. Aber es muss nichts zum Auslagern von Speicherplatz geschrieben werden - es ist die Datei verfügbar. Ich bin mir nicht sicher, ob dies zu einer besseren Leistung führen würde, da es immer noch besser ist, I/O in großen Blöcken auszuführen, und virtueller Speicher neigt dazu, Dinge in seitengroßen Blöcken zu verschieben.Einige Speichermanager können eine anständige Aufgabe ausführen, indem sie Seiten in Blöcken verschieben, um die E/A-Bandbreite zu erhöhen und Seiten vorab zu lesen. Aber ich habe das nicht wirklich im Detail studiert.
Lassen Sie Ihr Programm zuerst korrekt arbeiten. Dann optimieren.
Danke! Ich wusste nicht, QTextStream kann QByteArray nehmen. Das löst es total. – MadH