Page 2 sur 2

Publié : jeu. 17/févr./2005 12:08
par comtois
672 ms / 922 ms

P4 2,66

et j'ai les mêmes temps avec le code du soldat

Publié : ven. 18/févr./2005 11:45
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)

Publié : ven. 18/févr./2005 14:16
par djes
Attention avec les rgb, cela dépend de l'ordre des composantes de l'image.

Publié : ven. 18/févr./2005 17:30
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)

Publié : ven. 18/févr./2005 17:45
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!

:)

Publié : dim. 20/févr./2005 16:26
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)

Publié : lun. 21/févr./2005 20:22
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 ?

Publié : lun. 21/févr./2005 20:32
par Le Soldat Inconnu
Très léger avantage pour le ! mais la diférence est minime

Publié : lun. 21/févr./2005 20:49
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.

Publié : lun. 21/févr./2005 21:06
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)

Publié : lun. 21/févr./2005 22:51
par djes
Ouais enfin, comme dirait mon ami lfo-rate : "quand je fais un bench, je grave pas". :D