Frage

Ich habe darüber informiert, dass meine Bibliothek langsamer ist als es sollte in der Größenordnung von mehr als 30-mal sein, zu langsam auf eine bestimmte Datei (Textdatei, Größe 326 kb) Parsen. Der Benutzer vorgeschlagen, dass es sein kann, dass ich mit std::ifstream (vermutlich statt FILE).

Ich würde lieber nicht blind umschreiben, so dachte ich, ich würde hier zunächst prüfen, da meine Vermutung der Engpass anderswo wäre. Ich lese zeichenweise, so dass die einzigen Funktionen Ich verwende sind get(), peek() und tellg()/seekg().

Update:

Ich profiliert, und bekam verwirrend Ausgang - gprof nicht zu denken schien, dass es dauerte so lange. Ich schrieb das Programm die gesamte Datei in einen Puffer zu lesen, zuerst, und es beschleunigt von über 100x auf. Ich denke, das Problem der tellg()/seekg() gewesen sein kann, der eine lange Zeit in Anspruch nahm, aber gprof kann aus irgendeinem Grunde nicht in der Lage gewesen zu sehen, dass. In jedem Fall ifstream tut nicht erscheint die gesamte Datei zu puffern, auch für diese Größe.

War es hilfreich?

Lösung

Ich glaube nicht, dass einen Unterschied machen würde. Vor allem, wenn Sie char von char lesen, der Aufwand für I / O ist wahrscheinlich völlig dominiert alles sonst. Warum Sie einzelne Bytes zu einer Zeit gelesen? Sie wissen, wie extrem ineffizient ist?

Auf einer 326KB-Datei wird die schnellste Lösung höchstwahrscheinlich nur auf einmal in dem Speicher zu lesen.

Der Unterschied zwischen std :: ifstream und dem C-Äquivalente, ist im Grunde ein virtueller Funktionsaufruf oder zwei. Es kann einen Unterschied machen, wenn ein paar Dutzend Millionen Mal pro Sekunde ausgeführt, andernfalls nicht reall. Datei-I / O ist in der Regel so langsam, dass die API zugreifen verwendet, um es nicht wirklich keine Rolle spielt. Was zählt weit mehr ist die Lese / Schreib-Muster. Viele sucht schlecht sind, sequentiell liest / schreibt gut.

Andere Tipps

Es sollte etwas langsamer sein, aber wie das, was Sie gesagt haben, ist es vielleicht nicht der Engpass sein. Warum Sie nicht Ihr Programm Profil und sehen, ob das der Fall ist?

ich denke, dass es unwahrscheinlich ist, Ihr Problem durch von fstream Schalt behoben werden * auf FILE, in der Regel beide werden von der C-Bibliothek gepuffert. Auch das OS kann Cache liest (Linux ist sehr gut in diesem Aspekt). In Anbetracht der Größe der Datei zugreifen Sie ziemlich wahrscheinlich ist, wird es vollständig im RAM sein.

Wie PolyThinker sagen Sie am besten Ihr Programm Trog einen Profiler laufen eine festzustellen, wo das Problem ist.

Auch verwenden Sie seekg / tellg diese bemerkenswerte Verzögerungen führen kann, wenn die Festplatte stark fragmentiert ist, weil die Datei zum ersten Mal lesen, um die Platte, die Köpfe in die richtige Position zu bewegen.

Alle Benchmarks sind böse. Profil einfach Ihren Code für die Daten, die Sie erwarten.

Ich führte einen I / O-Performance-Vergleich zwischen Ruby, Python, Perl, C ++ einmal. Für meine Daten, Sprachversionen, etc C ++ 's-Variante war mehrmals langsamer (es eine große Überraschung war zu dieser Zeit).

Ich bin damit einverstanden, dass Sie das Profil sollte. Aber wenn Sie die Datei ein Zeichen in einer Zeit lesen, wie über eine Memory-Mapped-Datei erstellen? Auf diese Weise können Sie die Datei wie ein Array von Zeichen behandeln, und das Betriebssystem sollte für Sie alle Low-Level-Pufferung sorgen. Die einfachste und wahrscheinlich schnellste Lösung ist ein Sieg in meinem Buch. :)

Hier ist ein hervorragende Benchmark, die unter extremen Bedingungen zeigen, dass fstreams sind eigentlich recht langsam ... es sei denn:

  1. Sie verwenden Pufferung
  2. (ich nicht genug betonen kann)
  3. Sie manipulieren die sich puffern (dh, wenn Sie die Leistung wie OP in der verknüpften Frage müssen), die aus der Nutzung FILE* nicht so verschieden ist.

Sie sollten nicht vorzeitig optimieren, though. fstreams ist in der Regel besser, und wenn man sich in der Straße muß zur Optimierung nach unten, können Sie es jederzeit tun später mit wenig Kosten. Um das Schlimmste im Voraus vorzubereiten, schlage ich vor, die Schaffung eine minimal-Proxy für fstream so jetzt, dass Sie es später optimieren können, ohne Notwendigkeit, etwas anderes zu berühren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top