Math_Ador
Messages postés4Date d'inscriptionvendredi 12 janvier 2007StatutMembreDernière intervention30 avril 20101 24 janv. 2007 à 09:42
Je vous remercie à tous pour vos suggestions.
Pour l'instant j'ai du TAF au travail.
Je les utiliserais donc plus tard.
Mais je les ai lus (par acquis de conscience)... au moins.
Et je les trouves très intéressantes.
cs_Patrice99
Messages postés1221Date d'inscriptionjeudi 23 août 2001StatutMembreDernière intervention 9 septembre 2018 24 janv. 2007 à 08:52
> "trop" d'optimisation
Souvent l'optimisation se fait au détriment de la clarté du code, laquelle est importante pour la maintenance par exemple.
acx01b
Messages postés280Date d'inscriptiondimanche 7 septembre 2003StatutMembreDernière intervention 8 juillet 20146 23 janv. 2007 à 22:58
pour ce qui st de l'optimisation encore je ne sais pas si
ce n'est pas mieux:
while ((i+=2) <= racinecarre) {
if (n % i == 0) {
n /= i;
while (n % i == 0) {
compte++;
n /= i;
}
... // tu enregistres ici dans un tableau les diviseurs
compte=0;
racinecarre = racinecarrede(n);
// racinecarrede: fonction à optimiser car la version qui
// renvoie un double ne nous sert à rien
}
acx01b
Messages postés280Date d'inscriptiondimanche 7 septembre 2003StatutMembreDernière intervention 8 juillet 20146 23 janv. 2007 à 22:53
salut
on divise n par 2 tant que l'on peut
ensuite on divise n par 2i+1 pour i variant de 1 à racine carré de n (au maximum) divisée par 2 tant que c'est possible, et surtout quand n diminue on recalcule sa racine carré
ta boucle serait alors
i = 1;
racinecarre = racinecarrede(n);
while ((i+=2) <= racinecarre) {
if (n % i == 0) {
...
n /= (i-=2);
racinecarre = racinecarrede(n);
// racinecarrede: fonction à optimiser car la version qui
// renvoie un double ne nous sert à rien
}
}
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 23 janv. 2007 à 16:51
Simplement du au copier/coller qu'il ne faudrait jamais faire avec du code mais ça ne retire rien à ce que j'ai dit plus haut.
"trop" d'optimisation, je ne vois même pas ce que ça veut dire.
cs_Patrice99
Messages postés1221Date d'inscriptionjeudi 23 août 2001StatutMembreDernière intervention 9 septembre 2018 23 janv. 2007 à 16:33
Oui mais quand on fait trop d'optimisation, on devient distrait, et on oublis d'enlever i++, tout ça pour économiser 0.5 pouillème de seconde. Mieux vaux se concentrer sur la clarté du code source, et garder l'optimisation que pour les cas où on y gagne vraiment.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 22 janv. 2007 à 10:41
Les maths, c'est assurément indispensable, codé correctement c'est encore mieux.
Ta boucle fait i instructions de trop.
i = 0;
do {
puissance[i] = 0;
i++;
} while(i <= 255);
traduite par compilo, elle donne:
mov edx, _puissance ;// adresse tableau
xor eax, eax ;// i = 0
doI:
mov dword ptr[edx+eax*4], 0
add eax, 1
cmp eax, 255 ;// INUTILE ET DONC NUISIBLE AUX PERFS
jbe short doI
Toujours tendre vers 0 quand on peut:
i = 255;
do {
puissance[i] = 0;
i++;
} while(--i >= 0);
donnera cette fois:
mov edx, _puissance ;// adresse tableau
mov eax, 255 ;// i = 0
doI:
mov dword ptr[edx+eax*4], 0
sub eax, 1
jns short doI
ON gagne tout net 1 comparaison par tour de boucle, pas négligeable du tout.
24 janv. 2007 à 09:42
Pour l'instant j'ai du TAF au travail.
Je les utiliserais donc plus tard.
Mais je les ai lus (par acquis de conscience)... au moins.
Et je les trouves très intéressantes.
24 janv. 2007 à 08:52
Souvent l'optimisation se fait au détriment de la clarté du code, laquelle est importante pour la maintenance par exemple.
23 janv. 2007 à 22:58
ce n'est pas mieux:
while ((i+=2) <= racinecarre) {
if (n % i == 0) {
n /= i;
while (n % i == 0) {
compte++;
n /= i;
}
... // tu enregistres ici dans un tableau les diviseurs
compte=0;
racinecarre = racinecarrede(n);
// racinecarrede: fonction à optimiser car la version qui
// renvoie un double ne nous sert à rien
}
23 janv. 2007 à 22:53
on divise n par 2 tant que l'on peut
ensuite on divise n par 2i+1 pour i variant de 1 à racine carré de n (au maximum) divisée par 2 tant que c'est possible, et surtout quand n diminue on recalcule sa racine carré
ta boucle serait alors
i = 1;
racinecarre = racinecarrede(n);
while ((i+=2) <= racinecarre) {
if (n % i == 0) {
...
n /= (i-=2);
racinecarre = racinecarrede(n);
// racinecarrede: fonction à optimiser car la version qui
// renvoie un double ne nous sert à rien
}
}
23 janv. 2007 à 16:51
"trop" d'optimisation, je ne vois même pas ce que ça veut dire.
23 janv. 2007 à 16:33
22 janv. 2007 à 10:41
Ta boucle fait i instructions de trop.
i = 0;
do {
puissance[i] = 0;
i++;
} while(i <= 255);
traduite par compilo, elle donne:
mov edx, _puissance ;// adresse tableau
xor eax, eax ;// i = 0
doI:
mov dword ptr[edx+eax*4], 0
add eax, 1
cmp eax, 255 ;// INUTILE ET DONC NUISIBLE AUX PERFS
jbe short doI
Toujours tendre vers 0 quand on peut:
i = 255;
do {
puissance[i] = 0;
i++;
} while(--i >= 0);
donnera cette fois:
mov edx, _puissance ;// adresse tableau
mov eax, 255 ;// i = 0
doI:
mov dword ptr[edx+eax*4], 0
sub eax, 1
jns short doI
ON gagne tout net 1 comparaison par tour de boucle, pas négligeable du tout.