Bonjour,
J'aimerai savoir si une fonction existe pour accélérer l les exécution du code ,car par moment je trouve qu'il met du temps a l exécuter
Merci
Bonjour,
J'aimerai savoir si une fonction existe pour accélérer l les exécution du code ,car par moment je trouve qu'il met du temps a l exécuter
Merci
Bonjour,
Il n'y a pas à ma connaissance de fonction qui permette d'accélérer l'exécution du code.
Par contre il y a tout un tas de bonnes pratiques pour ne pas ralentir son exécution.
Ex :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 Select Case MonObjet Case ... Case ... ... End Select 'est mieux que If .... Then Else If ... Else If ... Else ... End IfPour l'accès aux données, il faut prendre l'habitude de rapatrier seulement les données dont on a besoin ainsi si on a besoin que, par exemple du nom d'un client, la requête "SELECT NomClient FROM Clients" est plus performante que "SELECT * FROM Clients".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 'Utiliser With MonObjet .Nom= ... _Prénom=.GetPrenom(i) . End With 'Est mieux que: MonObjet.Nom=... _Prénom=MonObjet.GetPrenom(i) Car dans ce cas, MonObjet est réévalué à chaque fois
On peut aussi effectuer les longs traitements en arrière plan sur un thread différent.
Il y a beaucoup de façons d'optimiser le code qui, je pense s'apprennent en lisant et en comparant le code que l'on fait avec celui que partagent les membres du forum.
J ai regardé un peu le cours vb net sur le threading,est ce que cela peut se faire en fonction et peut on rattache cela à une progressbar dans le sens ou le temps de chargement en fond de tâche soit affiché en progressbar
L'utilisation de l'un ou l'autre n'aura aucune incidence en terme de performance. En effet si tu regardes l'IL généré, le If/Else est remplacé par un Case. Donc dans l'absolu, ce serait plutôt l'inverse. Mais ce n'est pas là qu'il faut chercher des problèmes de performance, c'est plus une question de lisibilité du code...
Oui c'est faisable, le moyen le plus simple est d'utiliser un BackgroundWorker.Envoyé par chuspyto
Less Is More
Pensez à utiliser les boutons
,
et les balises code
Desole pour l'absence d'accents, clavier US oblige
Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.
Bonjour,
J'ai recherché un bon moment le document que j'avais lu et qui m'a fait dire que Select Case est plus optimisé que If ElseIf ...
Cours VB.Net de Mr Plasserre / Optimisation du code
Less Is More
Pensez à utiliser les boutons
,
et les balises code
Desole pour l'absence d'accents, clavier US oblige
Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.
Est ce que je doit utiliser la fonction backgroundworker ou le code du post#9 suffirai?
si c'était possible, ca voudrait dire que le code est ralenti volontairement, ce qui n'a pas de sens
le code s'exécute aussi vite qu'il peut, par contre ca dépend de ce que tu as écris
il y a toujours des dizaines de moyens de faire une chose, par contre certaines sont beaucoup plus performantes que d'autres
par contre sans explication ni code on ne pourra t'indiquer de pistes
le multithreading permet dans certains cas de gagner du temps, mais ce n'est pas forcément quelque chose à mettre entre les mains d'un débutant
voici un bout du code c'est a l'appel de traitement boucle que l'affichage est chargement des images est long.
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 Select Case True Case Me.J.Checked And Me.E.Checked And Me.B.Checked And Me.R.SelectedItem = "A" basdef = "Table1" jpg = "Table1_JPEG" traitement_boucle(1, 40, jpg, basdef) Case Me.J.Checked And Me.E.Checked And Me.B.Checked And Me.R.SelectedItem = "b" basdef = "Table2" jpg = "Table2_JPEG" traitement_boucle(2, 40, jpg, basdef) Case Me.J.Checked And Me.E.Checked And Me.B.Checked And Me.R.SelectedItem = "C" basdef = "Table3" jpg = "Table3_JPEG" traitement_boucle(3, 40, jpg, basdef) ...... end select
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
29
30
31
32
33
34
35
36
37
38 Private Sub traitement_boucle(ByVal cas As String, ByVal boucle As Integer, ByVal jpg As String, ByVal basdef As String) Dim Xwmp As IWMPMedia Dim lecture As String Dim cmd As OleDbCommand = cnn.CreateCommand Dim cmds As OleDbCommand = cnn.CreateCommand affichage_vignettes() For i = 1 To boucle cmd.CommandText = String.Format("SELECT Chm from {0} WHERE [ID] =" & i, jpg) cnn.Close() cnn.Open() Dim Lecturejpg As OleDbDataReader = cmd.ExecuteReader While Lecturejpg.Read() DirectCast(Me.Controls("AxWindowsMediaPlayer" & i), AxWindowsMediaPlayer).Visible = True Xwmp = DirectCast(Me.Controls("AxWindowsMediaPlayer" & i), AxWindowsMediaPlayer).newMedia(Lecturejpg(0)) DirectCast(Me.Controls("AxWindowsMediaPlayer" & i), AxWindowsMediaPlayer).currentPlaylist.insertItem(0, Xwmp) DirectCast(Me.Controls("AxWindowsMediaPlayer" & i), AxWindowsMediaPlayer).Ctlcontrols.play() DirectCast(Me.Controls("AxWindowsMediaPlayer" & i), AxWindowsMediaPlayer).Ctlcontrols.pause() End While cmds.CommandText = String.Format("SELECT eti from {0} WHERE [ID] =" & i, basdef) cnn.Close() cnn.Open() Dim Lectureeti As OleDbDataReader = cmds.ExecuteReader While Lectureeti.Read() Lecture = Lectureeti.GetString(0).Replace("_", " ") DirectCast(Me.Controls("Label" & i), Label).Visible = True DirectCast(Me.Controls("Label" & i), Label).Text = System.IO.Path.GetFileNameWithoutExtension(lecture) End While Next End Sub
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Private Sub affichage_vignettes() Dim i As Integer Me.AxWindowsMediaPlayer3000.currentPlaylist.clear() For i = 1 To 40 DirectCast(Me.Controls("AxWindowsMediaPlayer" & i), AxWindowsMediaPlayer).currentPlaylist.clear() DirectCast(Me.Controls("AxWindowsMediaPlayer" & i), AxWindowsMediaPlayer).Visible = False DirectCast(Me.Controls("Label" & i), Label).Visible = False Next End Sub
voilà par exemple ce qu'il ne faut pas faire
si boucle vaut 40 tu vas ouvrir 80 fois une connection, exécuter 80 requetes, alors que ca peut se faire avec une seule requête qui fait le tout
voir jointures pour ramener des infos de plusieurs tables, et faire une requete sans le where (ou un where sur une liste) et traiter selon l'id dans la boucle
est ce que je peux avoir 2 boucles de lectures pour extraires mes 2 donnees?
est ce que cela est bon?
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 For i = 1 To boucle cmd.CommandText = String.Format("SELECT Eti, Chm from {0} INNER JOIN {1} JPG.ID=BASDEF.ID WHERE [ID] =" & i, jpg,basdef), cnn) Dim Lecturejpg As OleDbDataReader = cmd.ExecuteReader While Lecturejpg.Read() DirectCast(Me.Controls("AxWindowsMediaPlayer" & i), AxWindowsMediaPlayer).Visible = True Xwmp = DirectCast(Me.Controls("AxWindowsMediaPlayer" & i), AxWindowsMediaPlayer).newMedia(Lecturejpg(0)) DirectCast(Me.Controls("AxWindowsMediaPlayer" & i), AxWindowsMediaPlayer).currentPlaylist.insertItem(0, Xwmp) DirectCast(Me.Controls("AxWindowsMediaPlayer" & i), AxWindowsMediaPlayer).Ctlcontrols.play() DirectCast(Me.Controls("AxWindowsMediaPlayer" & i), AxWindowsMediaPlayer).Ctlcontrols.pause() End While Dim Lectureeti As OleDbDataReader = cmds.ExecuteReader While Lectureeti.Read() Lecture = Lectureeti.GetString(0).Replace("_", " ") DirectCast(Me.Controls("Label" & i), Label).Visible = True DirectCast(Me.Controls("Label" & i), Label).Text = System.IO.Path.GetFileNameWithoutExtension(lecture) End While
Partager