Je suis en train d'essayer d'optimiser un programme que j'ai du faire.
A mon avis le temps d'execution entre :
a = a + 5;
et a += 5;
est le même mais je voudrais confirmation.
Je precise que ce genre d'opération est effectué des milliers de fois.
Je suis en train d'essayer d'optimiser un programme que j'ai du faire.
A mon avis le temps d'execution entre :
a = a + 5;
et a += 5;
est le même mais je voudrais confirmation.
Je precise que ce genre d'opération est effectué des milliers de fois.
Normalement c'est le même.
Je pense que les compilos optimisent cela.
A vérifier.
Houla, c'est pas là dessus que tu feras des optimisations ^^
Montre ta boucle qui s'execute plein de fois
Voilà une partie que je dois surement pouvoir optimiser.
Dans chaque case de mon tableau M, je voudrais insérer un bloc de 32 bits que j'ai lu dans un fichier.
J'ai procéder de la maniere suivante:
-lecture de 4 caractères consécutifs
-addition de ces caractères après avoir effectuer le décalage de bits
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 unsigned char octet; unsigned long int octetLong; unsigned long int * M; M = (unsigned long int *)malloc(16*sizeof(uint4)); [........] for(i=0;i<16;i++) { octetLong=0; for (j=0;j<4;j++) { fscanf(f,"%c",&octet); octetLong = octetLong + (octet << (32-8*(j+1))); } *(M+i)=octetLong; }
En effet ceci est un simple raccourci "d'écriture".Envoyé par guintolli
Personnellement, dans le soft de l'electronique embarqué, pour gagner en temps d'exécution on déroule les boucles. Ici les boucles ne sont pas excessivement longue ça reste du domaine du possible. De plus la taille du code n'est généralement pas un problème si tu es sur un PC.Envoyé par guintolli
A bientôt,
Vincent
D'accord pour le déroulement des boucles.
Il ne serait pas possible (plus rapide) aussi de lire directement 4 octets et de les insérer dans mon tableau sans avoir besoin de passer par un décallage de bits?
Où d'avoir quelque chose de plus rapide que le fscan?
Ben oui, je pense que c'est la meilleure solution. Et meme de lire directement un bloc de de 16 mots (en utilisant "fread" par exemple) .Envoyé par guintolli
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 if ( fread(M, sizeof *M, 16, f) != 16 ) { perror("fread"); exit(1); }
Peut-être passer par une union :
tu lui affecte 4 octets d'un coup via i
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 union CHAR4_INT32 { unsigned char c[4]; unsigned int i; };
tu echange les octets via le tableau de char
tu recupere l'entier par i
Il y a un truc que je ne comprend pas. Si au lieu de faire une boucle et de lire 4 caratère indépendant je fais:
fread(&t,sizeof(char),4,fichier)
Dans mon fichier il y a abcd, t va contenir dcba. C'est bormal que lors de la lecture de 4 caractères mes caractères se trouve inversés?
Euh pour l'union je voit pas trop![]()
Tout dépend la façon dont tu as écris ton fichier.Envoyé par guintolli
Si tu es sur une plateforme x86 et que :
- l'écriture a été faite octet par octet (a, b, c, d), alors tu dois relire la même chose (toujours octet par octet)
- l'écriture a été faite en "int" (abcd), alors la lecture octet par octet va donner "dcba", car tu es sur une platefore little endian.
Donc si tu ne veux pas avoir d'ennuis de ce type, je te conseille de relire ton fichier tel que tu l'as écrit (avec les mêmes types).
Et si c'est un fichier que tu as récupéré, alors dans ce cas il faut connaître son format.
Partager