Ah, in base alla tua modifica sei stato morso dal buffer readahead. Non è possibile testare due programmi che leggono i file fianco a fianco eseguendoli una volta. Il primo sarà sempre più lento poiché il file è su disco, una volta che il file è in memoria il secondo verrà eseguito più velocemente, è necessario creare nuovi dati per ciascuno o eseguirne uno e quindi eseguirli entrambi in modo che entrambi ottengano il vantaggio del readahead buffer.
Forse hai compilato senza ottimizzazione (o senza un'impostazione di ottimizzazione così alta)?
Inoltre, il tuo codice chiamerà sysWriteBuffer
una volta con readBytes
uguale a zero -- forse questo lo spiega (parzialmente)?
Potresti anche incorporare sysWriteBuffer (tramite uno switch del compilatore o manualmente).
"inlining" significa copiare il corpo di una funzione nel suo sito di chiamata per rimuovere l'overhead della chiamata di una funzione. A volte i compilatori lo fanno automaticamente (penso che -O3 abiliti questa ottimizzazione in gcc). Puoi anche usare il inline
parola chiave in gcc per dire al compilatore di incorporare una funzione. Se lo fai, la tua dichiarazione sarà simile a questa:
static inline int sysWriteBuffer(int fdout, char *buffer, ssize_t readBytes) {
....
Ricerca mmap(2).
Butterai via le sottigliezze di ftell/fread, ma salterà uno strato di indiretto se il throughput di lettura è davvero importante.