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 écolemais 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
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
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
Partager