(VB EXpress 2010 ) Performance : avec Call et sans Call
Bonjour,
Appel à des experts performance.
C'est un questionnement que j'ai depuis des années, et qui fait peut-être intervenir des caractéristqiues propres à chaque langage et compilateur.
Pas vraiment une guerre entre programmation dite spaghetti et programmation structurée ou objet. Quoique ....
( et je suis d'une très ancienne école :D mais très peu expérimenté en VBNet ).
En VBNet ( 2010 express ) je crée une petite application qui effectue une simple opération d'incrémentation d'un nombre CC dans une boucle.
Le premier test se fait avec le calcul dans la boucle, l'autre avec le calcul dans un call.
Les résultats sont éloquents ( dans mon test ).
Est ce moi qui utilise très mal l'art de programmer en VBNet? Y a t il des optimisations à la compilation que je n'ai pas vues?
Je sais que je peux faire de multiples appels à ma procédure depuis différents endroits dans mon programme, et que je ne dois donc pas répéter le code. Que cela facilite la maintenance ...
mais quand même, la performance peut être cruciale dans certains cas.
Cette performance est d'ailleurs importante dans une application que je construis.
Boucle avec Call 18 secondes
Boucle sans Call 5 secondes
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| Private Sub BCallWith_Click(sender As System.Object, e As System.EventArgs) Handles BCallWith.Click
debuts = Now
CC = 0
For i = 1 To 2000000000
Call Pr_Call()
Next
debute = Now
dureet = DateDiff(DateInterval.Second, debuts, debute)
TBDur.Text = dureet
TBCC.Text = CC
End Sub
Private Sub Pr_Call()
CC = CC + 1
End Sub
Private Sub BCallWithout_Click(sender As System.Object, e As System.EventArgs) Handles BCallWithout.Click
debuts = Now
CC = 0
For I = 1 To 2000000000
CC = CC + 1
Next
debute = Now
dureet = DateDiff(DateInterval.Second, debuts, debute)
TBDur.Text = dureet
TBCC.Text = CC
End Sub |
Et puis patatra, tout ce que je dis ne tient plus !!!! Je teste toutes facettes et me rends compte que si j'exécute d'abord "sans call" puis "avec call", les résultats s'inversent.
Nouveau démarrage de l'application.
Boucle sans Call 21 secondes
Boucle avec Call 12 secondes
Je redémarre encore une fois dans l'ordre Avec puis Sans.
Boucle avec Call 18 secondes
Boucle sans Call 5 secondes
Totalement perdu. Où est la logique?( Peut-être pas chez moi :) )
Y a t il un endroit où je pourrais trouver des conseils, des règles de performance?
Quelques commentaires sur ceci ( en espérant avoir bien expliqué ).
Grand merci.
Pierre