Les buffers utilisé par les fichiers sont contrôlé (activation, taille) par les commandes
setbuf() / setvbuf().
Après,
si la mémoire n'est pas un problème dans le programme, moi je lirais tous le fichier d'un seul coup dans un buffer temporaire et je travaillerait directement dessus. En plus de supprimer le morcellement des accès disque, ça éviterait également les quelques 720 x 560 appels/retour de fonctions de lecture (avec gestion de contexte, etc...).
Et puis, suivant l'algorithme qu'on va écrire derrière, ça faciliterait les accès non séquentielle à ces données (vs les multiples "seek()", si on voulait faire la même chose directement sur le fichier).
Par ailleur, il n'y a pas que le "l=j/70;" qui est redondant. On se rend bien compte que le "k=i/80;" aussi, aboutit 80% du temps au même résultat. Et celui-là, je suis pas certain que les optimiseurs savent en faire quelque chose.
Or, parmi les opérateurs de bases sur les entiers, la division est de très loin la plus coûteuse. Ca va dépendre des architectures, et je ne suis pas sûr de ce qu'il en est sur x86, mais '+', '-', '*' se règles généralement en un seul cycle d'horloge, tandis que la division peut en demander une bonne vingtaine ou quarantaine, suivant la plateforme.
Bon bien-sûr, sur PC, on n'a généralement pas besoin de se préoccuper de ce genre de détails et il est préférable de privilégier d'autres considération (réutilisation du code, lisibilité, maintenance, ...). Mais si un goulot d'étranglement critique a réellement été identifié, et en restant sur des boucles for, moi j'aurai proposé quelque chose comme ça:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| char buf[720*560];
int tableau9x8[9][8] = {{0}};
size_t ret = fread(buf, 1, 720*560, fichier);
if( ret == (720*560) ){
char *bufPtr = buf;
for(int row=0; row!=8; row++){
for(int r=70; r!=0; r--){
for(int col=0; col!=9; col++){
for(int c=80; c!=0; c--){
tableau9x8[col][row] += *bufPtr++;
}
}
}
}
} |
Partager