Optimiser un code
-
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :
Red(), Green() et Blue()
au lieu de faire ceci :
il est 2.6 fois plus rapide d'utiliser ceci
RGB()
au lieu de faire ceci :
il est 2 fois plus rapide d'utiliser ceci
au lieu de faire ceci :
Code : Tout sélectionner
Rouge = Red(Couleur)
Vert = Green(Couleur)
Bleu = Blue(Couleur)
Code : Tout sélectionner
Rouge = Couleur & $FF
Vert = Couleur >> 8 & $FF
Bleu = Couleur >> 16
Code : Tout sélectionner
#nb = 100000000
Couleur = $D254C7
Temps1 = ElapsedMilliseconds()
For n = 1 To #nb
; mettre ici votre code 1
Rouge = Red(Couleur)
Vert = Green(Couleur)
Bleu = Blue(Couleur)
Next
Temps2 = ElapsedMilliseconds()
For n = 1 To #nb
; mettre ici votre code 2
Rouge = Couleur & $FF
Vert = Couleur >> 8 & $FF
Bleu = Couleur >> 16
Next
Temps3 = ElapsedMilliseconds()
MessageRequester("Test rapidité", "Solution 1 : " + Str(Temps2 - Temps1) + " ; Solution 2 : " + Str(Temps3 - Temps2) + Chr(10) + "Ratio = 1 / " + StrF((Temps2 - Temps1) / (Temps3 - Temps2)), 0)
RGB()
au lieu de faire ceci :
Code : Tout sélectionner
Couleur = RGB(Rouge, Vert, Bleu)
Code : Tout sélectionner
Couleur = Rouge | Vert << 8 | Bleu << 16
Code : Tout sélectionner
#nb = 100000000
Rouge = 212
Vert = 102
Bleu = 57
Temps1 = ElapsedMilliseconds()
For n = 1 To #nb
; mettre ici votre code 1
Couleur = RGB(Rouge, Vert, Bleu)
Next
Temps2 = ElapsedMilliseconds()
For n = 1 To #nb
; mettre ici votre code 2
Couleur = Rouge | Vert << 8 | Bleu << 16
Next
Temps3 = ElapsedMilliseconds()
MessageRequester("Test rapidité", "Solution 1 : " + Str(Temps2 - Temps1) + " ; Solution 2 : " + Str(Temps3 - Temps2) + Chr(10) + "Ratio = 1 / " + StrF((Temps2 - Temps1) / (Temps3 - Temps2)), 0)
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
-
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :
Multiplier par l'inverse d'une valeur plutot que diviser
Si vous avez le calcul suivant à faire :
A = B / 3
Et bien il est 6 fois plus rapide de faire : (testé sur AMD athlon 900)
A = B * 0.3333333
Si vous avez le calcul suivant à faire :
A = B / 3
Et bien il est 6 fois plus rapide de faire : (testé sur AMD athlon 900)
A = B * 0.3333333
Code : Tout sélectionner
#nb = 30000000
a = 113
b = 164
b_inv.f = 1/b
Temps1 = ElapsedMilliseconds()
For n = 1 To #nb
c = a / b
Next
Temps2 = ElapsedMilliseconds()
For n = 1 To #nb
c = a * b_inv
Next
Temps3 = ElapsedMilliseconds()
MessageRequester("Test rapidité", "Solution 1 : " + Str(Temps2 - Temps1) + " ; Solution 2 : " + Str(Temps3 - Temps2) + Chr(10) + "Ratio = 1 / " + StrF((Temps2 - Temps1) / (Temps3 - Temps2)), 0)
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Je suis pas d'accord avec tes tests, tu parts du principe que tu connais la valeur à calculer à l'avance or dans le code ça ne sera pas le cas.
Tu devrais l'écrire ainsi pour que ça reste plausible:
Je te rassures, ça reste 3*plus rapide!

Tu devrais l'écrire ainsi pour que ça reste plausible:
Code : Tout sélectionner
For n = 1 To #nb
b_inv.f = 1/b
c = a * b_inv
Next

quand on a besoin de basculer l'état d'une variable entre 0 et 1
est plus rapide quea = a ! 1
même si on a besoin que d'un booleen , utiliser un long est 4 fois plus rapide.a = 1 - a
Code : Tout sélectionner
#nb = 30000000
Temps1 = ElapsedMilliseconds()
a.l = 0
For n = 1 To #nb
a = 1 - a
Next
Temps2 = ElapsedMilliseconds()
a = 0
For n = 1 To #nb
a = a ! 1
Next
Temps3 = ElapsedMilliseconds()
MessageRequester("Test rapidité", "Solution 1 : " + Str(Temps2 - Temps1) + " ; Solution 2 : " + Str(Temps3 - Temps2) + Chr(10) + "Ratio = 1 / " + StrF((Temps2 - Temps1) / (Temps3 - Temps2)), 0)
-
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :
N'oubliez pas le
et le
avant tout test.
Et pensez aussi à avant les routines à tester, ça vous permet d'être sûr que si vous changez des instructions avant, votre code est toujours aligné de la même façon, et les vitesses comparables.
Code : Tout sélectionner
SetPriorityClass_(GetCurrentProcess_(),#REALTIME_PRIORITY_CLASS)
Code : Tout sélectionner
SetPriorityClass_(GetCurrentProcess_(),#NORMAL_PRIORITY_CLASS)
Et pensez aussi à
Code : Tout sélectionner
!ALIGN 4
-
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :
Attention au #REALTIME_PRIORITY_CLASS car ça bloque tous les autres processus
dangereux dans le cas de gravure de CD par exemple
je préfère utiliser

je préfère utiliser
Code : Tout sélectionner
SetPriorityClass_(GetCurrentProcess_(), #HIGH_PRIORITY_CLASS)
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]