Ah, basierend auf Ihrer Bearbeitung wurden Sie vom Readahead-Puffer gebissen. Sie können nicht zwei Programme testen, die Dateien nebeneinander lesen, indem Sie sie einmal ausführen. Die erste ist immer langsamer, da sich die Datei auf der Festplatte befindet. Sobald sich die Datei im Speicher befindet, wird die zweite schneller ausgeführt. Sie müssen entweder für jede neue Daten erstellen oder eine ausführen und dann beide ausführen, damit beide vom Readahead-Puffer profitieren.
Vielleicht haben Sie ohne Optimierung kompiliert (oder ohne eine so hohe Optimierungseinstellung)?
Außerdem ruft Ihr Code sysWriteBuffer
auf einmal mit readBytes
gleich Null - vielleicht erklärt das (teilweise) es?
Sie können auch sysWriteBuffer einbetten (entweder über einen Compiler-Schalter oder von Hand).
"Inlining" bedeutet, den Hauptteil einer Funktion auf ihre Aufrufseite zu kopieren, um den Aufwand für den Aufruf einer Funktion zu beseitigen. Manchmal machen Compiler dies automatisch (ich denke, -O3 aktiviert diese Optimierung in gcc). Sie können auch den inline
verwenden Schlüsselwort in gcc, um den Compiler anzuweisen, eine Funktion einzubetten. Wenn Sie dies tun, sieht Ihre Deklaration wie folgt aus:
static inline int sysWriteBuffer(int fdout, char *buffer, ssize_t readBytes) {
....
Erforschen Sie mmap(2).
Sie werden Feinheiten von ftell/fread wegwerfen, aber es wird eine indirekte Ebene überspringen, wenn der Lesedurchsatz wirklich wichtig ist.