filestream unter Linux
-
Hallo,
ich wollte mal nachfragen wie es mit der Methode read() aussieht.
http://www.cplusplus.com/reference/iostream/istream/read/Werden intern vom Betriebssystem die geladenen Daten nochmals gebuffert, bevor man sie internen in den eigenen Programmbuffer laden kann oder geschieht das direkt wie bei der Kernel Funktion
int open(const char *pathname, int flags);
??
-
Ja, std::ifstream::read benutzt einen Buffer, den du aber ausschalten kannst, der Sinn davon ist es möglichst selten den Syscall read aufzurufen, da der recht teuer ist.
Der Syscall read buffert nicht garantiert, wird es aber zu 99,99% tun, da es noch viel teurer ist, Daten von der Platte zu laden und man freie I/O-Kapazitäten der Platte auf jeden Fall nutzt.Platte -> Kernel-Buffer -> read -> ifstream-Buffer -> ifstream::read wäre so die gewöhnliche Reihenfolge, wenn ifstream auf fread aufsetzt, wäre noch ne Bufferschicht dazwischen.
Was open mit der Frage zu tun hat, versteh ich grad nicht ganz.
-
wenn ich die Kernel Funktion benutze kann ich ja direkt von der platte ohne Umwege über 2 Buffer aus einer Datei lesen, was ja doch nochmal einen Geschwindigkeitsvorteil bringt.
-
anno schrieb:
wenn ich die Kernel Funktion benutze kann ich ja direkt von der platte ohne Umwege über 2 Buffer aus einer Datei lesen, was ja doch nochmal einen Geschwindigkeitsvorteil bringt.
Du willst Geschwindigkeit gewinnen, indem du Buffer vermeidest?
-
Soweit ich weiß, geht das aber auch nur, wenn du mehr als die interne Puffergröße ausliest und das System nicht zwischendurch iwie Zeit benötigen würde, um die Daten zwischenzuspeichern. Hoffe ich seh das richtig.
Wie groß der interne Speicher ist, ist halt die Frage. Und ob du überhaupt soviel kopierst.
-
Ethon__ schrieb:
Ja, std::ifstream::read benutzt einen Buffer, den du aber ausschalten kannst, der Sinn davon ist es möglichst selten den Syscall read aufzurufen, da der recht teuer ist.
Der Syscall read buffert nicht garantiert, wird es aber zu 99,99% tun, da es noch viel teurer ist, Daten von der Platte zu laden und man freie I/O-Kapazitäten der Platte auf jeden Fall nutzt.Platte -> Kernel-Buffer -> read -> ifstream-Buffer -> ifstream::read wäre so die gewöhnliche Reihenfolge, wenn ifstream auf fread aufsetzt, wäre noch ne Bufferschicht dazwischen.
Was open mit der Frage zu tun hat, versteh ich grad nicht ganz.
Wie hast Du die 99,99% ermittelt? Meine Messungen haben 99,973% ergeben.