Page 4 sur 5

Publié : mer. 08/févr./2006 14:24
par cederavic
un bout de code ça parle toujours mieu :

Code : Tout sélectionner


For h = 0 To 4
  Delay(1000)
  
  ti = ElapsedMilliseconds()
  For t= 0 To 1000000
    ac = Cos(Random(314) / 100)
  Next
  ta = ElapsedMilliseconds() - ti
  Debug "Normal : " + Str(ta)
  
  Delay(1000)
  
  ti = ElapsedMilliseconds()
  For t= 0 To 1000000
    ac = Cos(Random(314) / 100 * 1);1 car #PB_Math_Rad serait = 1 si on serait en radian par defaut
  Next
  ta = ElapsedMilliseconds() - ti
  Debug "Ced : " + Str(ta)
  
  
  m = 2 ; imaginons que le Mode radian = 2
  Delay(1000)
  
  ti = ElapsedMilliseconds()
  For t= 0 To 1000000
    If m = 2
      ac = Cos(Random(314) / 100)
    EndIf
  Next
  ta = ElapsedMilliseconds() - ti
  Debug "Dri : " + Str(ta)
Next

Publié : mer. 08/févr./2006 15:21
par Dr. Dri
Bon puisqu'il faut entrer dans les tests de performances alors pourquoi pas...
Première chose, on ne fait pas de test de vitesse avec le debugger
Deuxième chose, on ne compare pas des fonctions persos avec des fonctions natives. Les fonctions persos contiennent des entêtes qui prennent un petit temps CPU non négligeable comme le montre cet exemple:

Code : Tout sélectionner

Procedure.f Cos_(Angle.f)
  !FLD  dword [esp]
  !FCOS
EndProcedure

cos.f
Angle.f = Random(123)

;test avec la version native

depart = ElapsedMilliseconds()

For t= 0 To 1000000
  cos = Cos( Angle )
Next

duree = ElapsedMilliseconds() - depart

MessageRequester(StrF(cos), Str(duree))

;test avec la version perso

depart = ElapsedMilliseconds()

For t= 0 To 1000000
  cos = Cos_( Angle )
Next

duree = ElapsedMilliseconds() - depart

MessageRequester(StrF(cos), Str(duree))
Donc pour pouvoir comparer des choses comparables on va commencer par ne pas utiliser la fonction native de PB car si le systeme que je propose était natif il bénéficierai des mêmes augmentations de vitesse puisque les entetes disparaitrait. C'est pourquoi on va se baser une fonction RealCos comme dans l'exemple de cederavic.

Maintenant on fait les tests avec la fonction proposée et aussi avec la version native (remplacée pour les raisons qui précèdent) dans l'exemple que voici:
(ne pas oublier de noter le résultat, en moyenne 125 et 123 pour moi)

Code : Tout sélectionner

;la version proposée (simplifiée)
Enumeration
  #PB_Math_Rad
  #PB_Math_Deg
  #PB_Math_Grd
EndEnumeration

Global Pi.f ;la pseudo constante...
Pi = ValF("3.14159274101257320")

Global _PB_Math_Angles.l, _PB_Math_Coeff.f
_PB_Math_Angles = #PB_Math_Deg  ;je garde l'idée des degrés par défaut
_PB_Math_Coeff  = _PB_Coeff_Deg ;même si c'est pas le plus important

Procedure.l SetMathAngles(Type.l)
  Protected Error.l
 
  Select Type
    Case #PB_Math_Rad
      _PB_Math_Coeff = 1.0
    Case #PB_Math_Deg
      _PB_Math_Coeff = Pi / 180
    Case #PB_Math_Grd
      _PB_Math_Coeff = Pi / 200
    Default
      Error = #True
  EndSelect
 
  If Error = #False
    _PB_Math_Angles = Type
  EndIf
 
  ProcedureReturn Error ! #True
EndProcedure

Procedure.f Cos_(Angle.f)
  If _PB_Math_Angles
    Angle * _PB_Math_Coeff
  EndIf
  
  !FLD  dword [esp]
  !FCOS
EndProcedure

;le test
SetMathAngles(#PB_Math_Rad)

cos.f
Angle.f = Pi

depart = ElapsedMilliseconds()

For t= 0 To 1000000
  cos = Cos_( Angle )
Next

duree = ElapsedMilliseconds() - depart

MessageRequester(StrF(cos), Str(duree))

;le remplacement de la fonction native
Procedure.f RealCos(Angle.f)
  !FLD  dword [esp]
  !FCOS
EndProcedure

;le test

cos.f
Angle.f = Pi

depart = ElapsedMilliseconds()

For t= 0 To 1000000
  cos = RealCos( Angle )
Next

duree = ElapsedMilliseconds() - depart

MessageRequester(StrF(cos), Str(duree))
Voila, je pense que mon teste est un tantinet plus pertinent, et assez révélateur par la même occasion. Maintenant si y'en a qui trouvent encore à redire là dessus je crois que j'ai plus d'arguments cachés dans mes manches.

Dri :roll:

Publié : mer. 08/févr./2006 16:03
par cederavic
Un peut byzard ton test, j'ai un meilleur resultat avec Cos_() qu'avec RealCos(). Et la je pense que c'est toi qui ne veux rien savoir, car aparement tu n'a pas remarquer que ma methode n'est ni plus ni moin que la tienne sans If. Deplus dans mon test, ma methode et ta methode sont bien comparable car soumises au meme contraintes (ce qui n'est pas le cas avec le fonction native je suis d'accord).

Publié : mer. 08/févr./2006 16:08
par Dr. Dri
En fait j'ai pas vraiment compris, donc si tu pouvais m'expliquer plus en détails

Dri :oops:

Publié : mer. 08/févr./2006 16:53
par cederavic
Dr. Dri a écrit :En fait j'ai pas vraiment compris, donc si tu pouvais m'expliquer plus en détails

Dri :oops:
Au lieu d'avoir un SetMathAngles() et donc des IF, on donne le coef directement avec un param optionnel. Par exemple : Cos(Angle, #PB_Math_Deg) où #PB_Math_Deg = 180 / Pi
Cos vu de l'interieur ressemblerai ici à Cos(Angle * 180 / Pi)

Publié : mer. 08/févr./2006 17:00
par Dr. Dri
cederavic a écrit :Au lieu d'avoir un SetMathAngles() et donc des IF, on donne le coef directement avec un param optionnel. Par exemple : Cos(Angle, #PB_Math_Deg) où #PB_Math_Deg = 180 / Pi
Cos vu de l'interieur ressemblerai ici à Cos(Angle * 180 / Pi)
C'est bien ce que j'ai cru comprendre, le truc c'est que ca encombre le code
Autant directement faire Cos(Angle * 180 / Pi)

C'est pour cette raison que je propose tout mon bazar ^^
Tu choisis les angles et hop t'as plus de souci avec les conversions
Du coup t'utilises les fonctions comme si de rien n'était

Dri :)

Publié : mer. 08/févr./2006 19:10
par lionel_om
Moi je suis d'accord avec Dr. Dri. C'ets une bonne idée de faire un truc auto comme il le propose. Car y'en a pleins qui clamment que le radian c'est indispensable en native, mais :
1) il ne le réfute pas, mais veut simplement plus de souplesse pour ceux qui ne veulent pas se prendre la tête, sans déranger les "bêtes en maths"...
2) y'en a qui se disent partir du forum si [...], mais qui (il me semble) n'ont jamais pondu un code sur les maths. Dri et Comptois sont les seuls (sur le forum français) à poster des codes avec de la trigo. Donc je trouve un peu gonflé de se la raconter en disant : "moi j'suis un dieu en maths et toi t'es de la merde" et n'avoir jamais rien posté (donc pe etre jamais rien fait), surtout qu'encore une fois pour les "matheux", dc pas très "littéraires" qu'il ne poste pas cela pour vous emmerder et ralentir vos chers petits Cos, mais juste pour alléger les codes...

Publié : mer. 08/févr./2006 19:29
par djes
Vous auriez dû rajouter qu'il y en a qui veulent bien des degrés si ça ne ralentit pas (DU TOUT) les radians.

Pourquoi j'insiste là dessus? Parce que les fonctions trigos sont les plus utilisées dans les calculs intensifs en 3D. Comme il n'est pas rare d'avoir plusieurs milliers de points à calculer en 3D, le plus petit cycle perdu est dommageable. Donc, il faut éviter les tests et autres horreurs dans ce genre.

Au début, Dri était pour l'utilisation d'un subsystem, ce qui me semble idéal, car dans ce cas, il n'y a pas de perte de vitesse : grâce à une constante définie dans le code, le compilateur prend des fonctions (natives) en degrés ou en radians (c'est quand même à vérifier, je n'en suis pas sûr à 100%). Par contre, je ne sais pas si on pourrait changer de système plusieurs fois, il faudrait donc quand même des fonctions de conversions.

Si maintenant on fait des IF ou autres tests, on y perd en vitesse et je suis contre.

Publié : mer. 08/févr./2006 20:51
par Dr. Dri
djes a écrit :Si maintenant on fait des IF ou autres tests, on y perd en vitesse et je suis contre.
Si tu as un réel besoin de vitesse, calcule ton cosinus directement en assembleur, pas d'utilisation de la pile, là t'as aucune perte... Surtout qu'en PB c'est pas difficile...

Dri

Publié : mer. 08/févr./2006 22:15
par Guimauve
Message supprimé

Publié : mer. 08/févr./2006 22:30
par lionel_om
Moi j'ai :
La fonction RealCos() avec 3.141592/3 = 0.500000
La fonction Cos() de PB avec 3.141592/3 = 0.500000
La fonction RealCos() avec0 = 1.000000
La fonction RealCos() avec1 = 0.540302
La fonction RealCos() avec2 = -0.416147
La fonction RealCos() avec3 = -0.989992
La fonction RealCos() avec4 = -0.653644
La fonction RealCos() avec5 = 0.283662
Donc ca marche :wink: (v3.9x)

Par contre sur la v4, ca donne bien 1.000000 partout...
Bug de la v4 ???

Publié : mer. 08/févr./2006 22:42
par Backup
....

Publié : mer. 08/févr./2006 23:08
par djes
Dr. Dri a écrit :
djes a écrit :Si maintenant on fait des IF ou autres tests, on y perd en vitesse et je suis contre.
Si tu as un réel besoin de vitesse, calcule ton cosinus directement en assembleur, pas d'utilisation de la pile, là t'as aucune perte... Surtout qu'en PB c'est pas difficile...

Dri
Oui, quelque part t'as raison... Et quelque part t'as tort aussi puisque j'aime PB parce qu'il est à mi-chemin entre convivialité et rapidité... Si je voulais la simplicité je prendrais VB :twisted: Si je voulais la rapidité pure, je ferais tout en assembleur!

Bref, on n'en sort pas! :lol:
J'abandonne!

Publié : mer. 08/févr./2006 23:11
par Frenchy Pilou
@Dobro
En plus si tu mets une photo à la place du texte cela ferait une horloge originale :lol:
Et si .... sonnait, on aurait l'heure :lol: (célèbre contine)
Excusez-moi, j'ai pas pu résisté, c'était l'occasion rêvée :roll:

Publié : mer. 08/févr./2006 23:22
par djes
Dobro a écrit :moi aussi la preuve voici ce que je montre a ceux qui ne veulent pas des
degres
C'est pas un site de c** ici! :D