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
Version imprimable
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:
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 If
Pour 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:
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.Citation:
Envoyé par chuspyto
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
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:
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:
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:
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:
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
Sinon j utiliser déjà le sélect case
Est ce que je doit utiliser la fonction backgroundworker ou le code du post#9 suffirai?
Je ne pourrai pas vous répondre, je ne suis pas du métier, je savais juste que je l'avais lu quelque part.Citation:
Je serais curieux de savoir comment a été mesuré le fait que ça soit 20% plus rapide. Je reste très sceptique.
Sinon, comme l'a dit Pol63, votre problème de lenteur vient du fait que vous exécutez X requêtes mal faite qui rapatrie seulement quelques enregistrements au lieu de faire une seule requête qui retourne l'ensemble des données attendu et les traiter par la suite.
Est ce que code que j ai rectifié en post #9 pourrait fonctionner car j ai un doute concernant les 2 boucle while
non, y a de l'idée mais c'est pas encore ca, il faut un seul commandtext, un seul executereader
par contre il faut bien une boucle pour mettre tous les id dans la requete
à la place de = quand on a plusieurs choses il faut in ( )
exemple : where colonne in (1, 4, 85)
par contre le select case qui gagne 20% ca m'étonnerait aussi, et de toute facon il faudrait une boucle énorme pour avoir un gain autre que théorique
Merci pour tes informations peux tu me dire à quoi correspondrait where colonne in(1,4,85)?
De plus sais tu ou je pourrais avoir des infos concernant tout cela?
Merci
un truc dans le genreCode:
1
2
3
4
5
6
7
8
9
10 cmd.CommandText = "SELECT Eti, Chm from {0} INNER JOIN {1} JPG.ID=BASDEF.ID WHERE [ID] IN (" For i = 1 To boucle cmd.commandtext &= i.tostring & ", " next cmd.commandtext.remove(0,cmd.commandtext.length-2) ' de tête, à vérifier ; c'est pour retirer le dernier , cmd.commandtext &= ")" cmd.commandtext = String.Format(cmd.commandtext,jpg,basdef)
et concernant le "où on trouve des infos là dessus", dans l'aide de ta base de données ou sur internet, ca fait partie du langage sql
et comme tout langage il convient d'en apprendre les bases avant de l'utiliser
Comme j ai du mal à suivre je vais essayer de me plonger dans le sql,car jusqu à maintenant je l utiliser en vba de manière simple
oui, et faites quelques essais de requete directement sur la base pour voir le résultat
d'ailleurs il manque la colonne ID dans le select, car vu que dans le where on va préciser plusieurs id, ca va retourner plusieurs lignes, il faudra alors savoir sur quel id on est dans le while .Read
Une chose que j'ai du mal à comprendre est comment dans une boucle while on peut lire 2 données venant de 2 tables différentes?