Optimiser un code

Partagez votre expérience de PureBasic avec les autres utilisateurs.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

672 ms / 922 ms

P4 2,66

et j'ai les mêmes temps avec le code du soldat
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

Red(), Green() et Blue()

au lieu de faire ceci :

Code : Tout sélectionner

Rouge = Red(Couleur)
Vert = Green(Couleur)
Bleu = Blue(Couleur)
il est 2.6 fois plus rapide d'utiliser ceci

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)
il est 2 fois plus rapide d'utiliser ceci

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)]
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Attention avec les rgb, cela dépend de l'ordre des composantes de l'image.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

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

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)]
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

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:

Code : Tout sélectionner

For n = 1 To #nb 
  b_inv.f = 1/b 
  c = a * b_inv 
Next 
Je te rassures, ça reste 3*plus rapide!

:)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

quand on a besoin de basculer l'état d'une variable entre 0 et 1
a = a ! 1
est plus rapide que
a = 1 - a
même si on a besoin que d'un booleen , utiliser un long est 4 fois plus rapide.

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)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

j'ai refait un test du dernier code juste après un démarrage de mon ordi , et cette fois ci , j'obtiens exactement les mêmes temps pour les deux solutions .
alors que dimanche, j'avais un écart de 25% . et chez vous ?
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

Très léger avantage pour le ! mais la diférence est minime
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)]
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

N'oubliez pas le

Code : Tout sélectionner

SetPriorityClass_(GetCurrentProcess_(),#REALTIME_PRIORITY_CLASS) 
et le

Code : Tout sélectionner

SetPriorityClass_(GetCurrentProcess_(),#NORMAL_PRIORITY_CLASS) 
avant tout test.

Et pensez aussi à

Code : Tout sélectionner

!ALIGN 4
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.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

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

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)]
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Ouais enfin, comme dirait mon ami lfo-rate : "quand je fais un bench, je grave pas". :D
Répondre