Ah, sur la base de votre modification, vous étiez mordu par le tampon de lecture anticipée. Vous ne pouvez pas tester deux programmes qui lisent des fichiers côte à côte en les exécutant une seule fois. Le premier sera toujours plus lent puisque le fichier est sur le disque, une fois que le fichier est en mémoire, le second s'exécutera plus rapidement, vous devez soit créer de nouvelles données pour chacun, soit en exécuter un, puis exécuter les deux afin qu'ils bénéficient tous les deux du tampon de lecture anticipée.
Peut-être avez-vous compilé sans optimisation (ou sans paramètre d'optimisation aussi élevé) ?
De plus, votre code s'appellera sysWriteBuffer
une fois avec readBytes
égal à zéro - peut-être que cela l'explique (partiellement) ?
Vous pouvez également utiliser sysWriteBuffer en ligne (soit via un commutateur de compilateur, soit à la main).
"inlining" signifie copier le corps d'une fonction sur son site d'appel afin de supprimer la surcharge liée à l'appel d'une fonction. Parfois, les compilateurs le font automatiquement (je pense que -O3 active cette optimisation dans gcc). Vous pouvez également utiliser le inline
mot-clé dans gcc pour indiquer au compilateur d'intégrer une fonction. Si vous faites cela, votre déclaration ressemblera à ceci :
static inline int sysWriteBuffer(int fdout, char *buffer, ssize_t readBytes) {
....
Recherche mmap(2).
Vous allez jeter les subtilités de ftell/fread, mais cela sautera une couche d'indirection si le débit de lecture est vraiment important.