Page 1 sur 1

Optimisation du compilateur

Publié : ven. 09/sept./2011 17:30
par Le Soldat Inconnu
Salut,

Je faisais des essais de vitesse et j'ai constater une lacune du compilateur

à savoir que :
a = b * 10 * 50 * 100
est plus lent que :
a = 10 * 50 * 100 * b

ce qui n'est pas logique.

Le compilateur arrive bien à simplifier
a = 10 * 50 * 100 * b
en regroupant les constantes en seules variable, donc à compiler directement a = 50000 * b
mais si on écrit
a = b * 10 * 50 * 100
il n'y arrive pas

Le test :

Code : Tout sélectionner

#Max = 400000000
Dim Temps(10)

Temps(1) = ElapsedMilliseconds()

For i = 1 To #Max
	Calcul.f = Radian(i * 10) + 5
Next

Temps(2) = ElapsedMilliseconds()

For i = 1 To #Max
	Calcul.f = 10 * #PI / 180 * i + 5
Next

Temps(3) = ElapsedMilliseconds()

For i = 1 To #Max
	Calcul.f =  i * 10 * #PI / 180 + 5
Next

Temps(4) = ElapsedMilliseconds()

For i = 1 To #Max
	Calcul.f =  i * (10 * #PI / 180) + 5
Next

Temps(5) = ElapsedMilliseconds()

For i = 1 To #Max
	Calcul.f = (10 * #PI / 180) * i + 5
Next

Temps(6) = ElapsedMilliseconds()

; Affichage du résultat
For  i = 2 To 6
	If i > 2
		Texte.s + Chr(10)
	EndIf
	Texte.s + Str(Temps(i) - Temps(i - 1))
	If i > 2
		If (Temps(i) - Temps(i - 1)) > (Temps(2) - Temps(1))
			Texte + " ( x " + StrD((Temps(i) - Temps(i - 1)) / (Temps(2) - Temps(1)), 2) + " )"
		Else
			Texte + " ( / " + StrD((Temps(2) - Temps(1)) / (Temps(i) - Temps(i - 1)), 2) + " )"
		EndIf
	EndIf
Next
MessageRequester("Temps", Texte)
Il en pense quoi, notre Fred nationnal ?

++

Re: Optimisation du compilateur

Publié : ven. 09/sept./2011 17:38
par Fred
C'est vrai, le parser agrège de gauche à droite, ca va pas etre facile à changer. C'est un cas extreme, c'est rare d'avoie des constantes qui se suivent sans mettre la valeur finale.

Re: Optimisation du compilateur

Publié : ven. 09/sept./2011 17:40
par Le Soldat Inconnu
Je fais ça tout le temps en pensant que le compilateur regroupe les constantes qui se suive :mrgreen: c'est bien plus lisible sur des calculs mathématiques complexes d'avoir l'ensemble des constantes sans simplification.

Chose dont on avait déjà parler. Et je viens de me rendre compte que sans mettre de parenthèses, c'est pas une bonne idée :)

Avec des parenthèses, c'est bon, mais il faut y penser.

Comme ce calcul par exemple :

Code : Tout sélectionner

a = Angle * (#Angle_Resolution * 180 / #PI) + (360 * #Angle_Resolution)
Sans parenthèses, il est est bien plus lent (2 à 3 fois)