Wie teuer ist es in C ++, die Operation istream :: seekg zu verwenden?
EDIT: Wie viel kann ich mit der Suche nach einer Datei und Bytes lesen? Was ist mit der Frequenz gegenüber der Größe des Offsets?
Ich habe eine große Datei (4 GB), die ich analysiere, und ich möchte wissen, ob es notwendig ist, einige meiner seekg-Aufrufe zu konsolidieren. Ich würde annehmen, dass die Größe der Unterschiede in der Dateiposition eine Rolle spielt - wie wenn Sie mehr als eine Seite im Speicher suchen, wird es die Leistung beeinträchtigen - aber kleine Suche ist ohne Bedeutung. Ist das korrekt?
Diese Frage hängt stark von Ihrem Betriebssystem und dem Festplatten-Subsystem ab.
Offensichtlich wird die Suche selbst im Wesentlichen Null Zeit dauern, da sie nur einen Offset aktualisiert. Tatsächlich liest das Lesen einige Daten von der Festplatte ...
... aber wie viele Daten von vielen Dingen abhängen. Ihre Festplatte hat einen Cache, der möglicherweise eine eigene Blockgröße hat und möglicherweise eine Art Read-Ahead durchführt. Ihr RAID-Controller (falls vorhanden) wird seinen eigenen Cache haben, möglicherweise mit einer eigenen Blockgröße und Read-Ahead.
Ihr Kernel hat einen Seitencache - im Prinzip alles von freiem RAM - und wird wahrscheinlich auch eine Art Read-ahead machen. Unter Linux ist dies konfigurierbar, und der Kernel passt es an, wie sequentiell Ihre Zugriffsmuster aussehen, ob Sie posix_fadvise
, etc. Aufgerufen haben.
Alle diese Caches bedeuten, dass Sie, wenn Sie auf einige Daten zugreifen und später auf Daten in der Nähe zugreifen, eine Chance haben, dass der zweite Zugriff die Festplatte überhaupt nicht berührt.
Wenn Sie die Möglichkeit haben, so zu codieren, dass Sie sequentiell auf die Datei zugreifen, ist das sicherlich schneller als zufällige Lesevorgänge, insbesondere bei kleinen zufälligen Lesevorgängen. Die Suche nach einer einzelnen mechanischen Festplatte dauert etwa 10 ms, so dass Sie hier rechnen können. (Obwohl die Suche nach einem Solid-State-Laufwerk etwa 100-mal schneller ist.)
Große Lesevorgänge sind im Allgemeinen besser als kleine Lesevorgänge ... Obwohl die Verarbeitung von Daten jeweils einige Kilobyte gleichzeitig schneller sein kann als größere Blöcke, kann die Verarbeitung im Cache verbleiben.
Kurz gesagt, Sie müssen viel mehr Details über Ihr System und Ihre Anwendung bereitstellen, um eine richtige Antwort zu erhalten, und selbst dann ist die wahrscheinlichste Antwort "benchmarken Sie es".
Tags und Links c++ large-files ifstream seek seekg