Nombre d'operations et temps de calcul

marinmarais Messages postés 104 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 16 juillet 2010 - 15 févr. 2008 à 11:55
marinmarais Messages postés 104 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 16 juillet 2010 - 15 févr. 2008 à 14:17
Bonjour à tous et à toutes,


Je suis en train d'écrire des algorithmes en vue d'optimiser le temps de calcul et le nombre d'operation.
Dans un de mes cas, en gros, je dois calculer la moyenne d'une série puis son écart-type (simple) mais j'ai deux voies possibles :


La premiere :

> temporaire=0
> For i=1 to n
>      temporaire=temporaire+x(i)
> Next i
> moyenne=temporaire/n
> temporaire=0
> for i=1 to n
>       temporaire=temporaire+(x(i)-moyenne)^2
> Next i
> sigma=(temporaire/(n-1))^0.5


J'ai calculé la moyenne et l'écart-type des xi en 2*n+2 opérations avec deux boucles.


Mais si n est suffisamment grand (c'est-à-dire 1/n à peu près égal à 1/(n-1)) je peux utiliser une astuce en introduisant la valeur rms. J'ai alors une autre possibilité :

> temporaire1=0
> temporaire2=0
> For i=1 to n
>        temporaire1=temporaire1+x(i)
>        temporaire2=temporaire2+x(i)^2
> Next i
> moyenne=temporaire1/n
> rms2=temporaire2/n
> sigma=(rms2-moyenne^2)^0.5


J'ai aussi calculé la moyenne et l'écart-type des xi, mais cette fois-ci en 2*n+3 opérations en une seule boucle.


D'après vous, laquelle des deux prendra le plus de temps ?


Je vous remercie d'avance.
Cordialement,
Thomas.








Marin Marais

4 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
15 févr. 2008 à 12:20
Bon, bah on fait comme on a dit, hein !

Bonjour
lol, désolé, dépassé par les stats
Côté programmation :
- Tu peux chronométrer chacune des méthodes en utilisant l'API GetTickCount qui te renverra le nombre de mSec écoulées depuis minuit et en faisant la différence entre la valeur mémorisée avant le calcul et la valeur après calcul
   Declare Function GetTickCount Lib "kernel32" Alias "GetTickCount" () As Long
   Dim mSecDepuisMinuit = GetTickCount
 Pour des calculs plus précis (si le temps de calculs est trop faible par rapport à la mSec), il y a d'autres méthodes pour récupérer le nombre de cycle d'horloge du processeur - précision au millionnième <exemple ici>
- Tu peux aussi essayer de remplacer les boucles For-Next par des Do-Loop, c'est quelques fois plus rapide :
   i = 0
   Do While i < n
      ' tes calculs ici
      i = i + 1
   Loop

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
NHenry Messages postés 15156 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 29 septembre 2024 159
15 févr. 2008 à 12:23
Bonjour

Tu peux aller voir ce tutorial.

Sinon, sache que x^2 est plus long à calculer que x*x.

Dans Word, j'Excel. (juste pour la citation)
VB (6, .NET1&2), C++, C#.Net1
Mon site
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
15 févr. 2008 à 12:47
pas GetTickCount !
GetProcessTimes....

sinon, tu hérite de tout ce qui tourne sur ta bécane dans les vlaeurs récupérees

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
marinmarais Messages postés 104 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 16 juillet 2010 1
15 févr. 2008 à 14:17
Merci à vous trois pour le temps que vous avez consacré à mon problème.
Grâce à la fonction "TIC TOC" sur MatLab, j'ai pu regarder le temps nécessaire à ce calcul des deux manières.
J'ai généré des vecteurs aléatoires de 1000 lignes à partir desquels j'ai calculé la moyenne et l'écart-type suivant les deux algos.


J'ai mesuré 20 fois le temps dans chacun des deux cas et voici les temps moyens :
- 1er cas : 0.060s à +/- 0.007s près
- 2nd cas : 0.015s à +/- 0.003s près


Voili voilou.
Bien sûr le résultat ne serait pas tout à fait pareil sur VB mais j'ai l'intuition que la tendance serait la même.



A+,
Tom.

Marin Marais
0
Rejoignez-nous