COURS OPTIMISATION DU CODE VB AVEC PROGRAMME DE TEST
cobra84
Messages postés42Date d'inscriptiondimanche 26 août 2001StatutMembreDernière intervention13 août 2007
-
6 août 2002 à 15:34
cs_mehdibou
Messages postés365Date d'inscriptionvendredi 24 mai 2002StatutMembreDernière intervention18 octobre 2004
-
18 août 2003 à 18:19
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
cs_mehdibou
Messages postés365Date d'inscriptionvendredi 24 mai 2002StatutMembreDernière intervention18 octobre 2004 18 août 2003 à 18:19
Je voudrais juste dire que le test Len() est lstrlen() est faussé car le type String en VB stocke la longueur de la chaine, la fonction est donc extremement rapide. Mais l'utilisation de l'api oblige VB a convertir la chaine unicode (car VB6 gère les chaines ainsi) en chaine format C (et donc obligation de parcourir toute la chaine avant d'en trouver la fin).
Dalida
Messages postés6728Date d'inscriptionmardi 14 mai 2002StatutContributeurDernière intervention11 janvier 2016 23 janv. 2003 à 08:58
salut,
juste pour le plaisir : BRAVO !!!
cobra84
Messages postés42Date d'inscriptiondimanche 26 août 2001StatutMembreDernière intervention13 août 2007 15 nov. 2002 à 19:59
J'ais déjà pensé programmer un Add-In Vb pour optimiser le code mais après reflexion, j'ais laissé tombé. En effet, le programmeur doit apprendre à produire un code de qualité et optimisé, il ne doit pas s'appuyer sur un programme qui le ferais à sa place; le programmeur est capable de produire un code largement meilleur qu'un programme... La meilleure solution est de downloader des cours sur l'optimisation, c'est pour cela que j'ai posté cette source.
@+ et bonne prog!
Ricpperso
Messages postés236Date d'inscriptionjeudi 24 janvier 2002StatutMembreDernière intervention26 octobre 2004 15 nov. 2002 à 14:37
De ton cerveau, la plupars des cerveau on un langage énormement plus évolué et énormément plus rapide que nos ordi.
leptidev
Messages postés206Date d'inscriptionmercredi 30 janvier 2002StatutMembreDernière intervention 4 décembre 2007 15 nov. 2002 à 11:05
Marrant, VB ne donne jamais le même temps d'exécution pour des instructions similaire, pkoi ????
C vrai qu'un forum sur l'optimisation serait le bienvenue.
au fait, tu pourrais créer un programme qui optimise automatiquement le code généré par notre pauvre cerveau, non ?
cobra84
Messages postés42Date d'inscriptiondimanche 26 août 2001StatutMembreDernière intervention13 août 2007 8 août 2002 à 16:56
Voila, je viens de mettre à jour le Zip et la capture.
@ Brushttiii Pok ;-)
cs_Fife
Messages postés73Date d'inscriptionlundi 23 octobre 2000StatutMembreDernière intervention16 mars 20083 8 août 2002 à 13:01
Super interressant
Bon... je vais voir ce que je peux faire avec Right et Left...
Excellente idée !!!
@+
cobra84
Messages postés42Date d'inscriptiondimanche 26 août 2001StatutMembreDernière intervention13 août 2007 8 août 2002 à 08:54
Je suis en train de préparer la nouvelle version. Elle comportera plus de tests et il y aura aussi un autre programme permettant de comparer les différents types de compilation que propose Vb... D'après les premiers tests que j'ai éffectué, la compilation en P-Code est à la traine ;-)
Aller @+
cs_urban
Messages postés8Date d'inscriptionvendredi 21 juin 2002StatutMembreDernière intervention 8 août 2002 7 août 2002 à 23:25
Interessant cette partie, ça demanderait un forum, rien que pour rassembler toutes les améliorations ... Moi, j'utilise beaucoup de rotations sur recordset avec un test sur le EOF... quand je dis beaucoup, ce sont des milliers de fois ! Je vais m'y interesser de prés et remplacer toutes mes occurences lors d'utilisation de dynaset. Bravo. Bonnes idées.
Sheikah
Messages postés6Date d'inscriptionmercredi 7 août 2002StatutMembreDernière intervention 7 août 2002 7 août 2002 à 22:38
Et idem avec les If imbriqués et Select case :|
Sheikah
Messages postés6Date d'inscriptionmercredi 7 août 2002StatutMembreDernière intervention 7 août 2002 7 août 2002 à 22:33
Nox a raison, "If x = True" est plus rapide que "If x" 1 fois sur 2 !
Sheikah
Messages postés6Date d'inscriptionmercredi 7 août 2002StatutMembreDernière intervention 7 août 2002 7 août 2002 à 22:27
Hmbon on est pas à un commentaire positif près ;) Bravo!
cs_jeanyves
Messages postés57Date d'inscriptionsamedi 30 mars 2002StatutMembreDernière intervention24 mars 2003 7 août 2002 à 17:15
Très bien fait, très enrichissant et même édifiant en ce qui concerne les temps de traitement.
yoyogott
Messages postés14Date d'inscriptionmardi 27 février 2001StatutMembreDernière intervention25 septembre 2007 7 août 2002 à 16:26
En parlant d'orthographe j'ai oublié un 's' oups m'i suis trompette !!
yoyogott
Messages postés14Date d'inscriptionmardi 27 février 2001StatutMembreDernière intervention25 septembre 2007 7 août 2002 à 16:25
Génial, pour des perfectionniste comme moi tu as tapé dans le mille ;-)
Et les gars siou plait, faites gaffe à l'orthographe please ...
Merci à toi cobra84
cobra84
Messages postés42Date d'inscriptiondimanche 26 août 2001StatutMembreDernière intervention13 août 2007 7 août 2002 à 11:29
J'ais mis à jour le Zip... Mais il me reste pleins de tests à implementer!
@+ ;-)
Neo.balastik
Messages postés796Date d'inscriptionjeudi 17 mai 2001StatutMembreDernière intervention 5 mai 20097 7 août 2002 à 08:54
Encore une autre idée interressante... (tu me diras, y'en a des masses).
Lors de l'utilisation d'un recordset (avec ADO, DAO). Il vaut largement mieux utiliser une boucle For Next que faire une Do Until EOF.
Exemple:
Do Until MyRs.EOF
Me.Text1.Text = MyRs.Fields(1).Value
MyRs.MoveNext
Loop
EST BEAUCOUP PLUS LENT QUE
Dim RecCount As Long
Dim I As Long
MyRs.MoveLast
MyRs.MoveFirst
RecCount = MyRs.RecordCount
For I=1 to RecCount
Me.Text1.Text = MyRs.Fields(1).Value
MyRs.MoveNext
Next I
La 2e façon de faire est plus rapide que la première. Ceci est du au fait qu'il n'y a pas de vérification de fin de fichier à chaque passage dans la boucle. Ceci est surtout probant pour des jeux d'enregistrements conséquents, comme pour beaucoup d'autres exemples.
Certes la 2e façon de faire est plus longue en code, mais sachez qu'en VB, le code le plus court n'est pas forcément plus rapide à l'exécution.
Les instructions du type: IIF, CHOOSE, SWITCH, REPLACE,... sont très certainement plus lentes que si on les avait écrite nous mêmes. Mais c'est vrai qu'à l'écriture du code, c'est beaucoup plus rapide à 'pondre'.
J'ai lu aussi qu'il était plus judicieux d'utiliser des variables de type LONG au lieu de l'INTEGER. VB6 fonctionnant en 32 bits, celui-ci serait plus optimal avec la gestion du type LONG, ce qui me correct comme raisonnement.
Bonne prog à toutes et àtous...
NéoB
cobra84
Messages postés42Date d'inscriptiondimanche 26 août 2001StatutMembreDernière intervention13 août 2007 7 août 2002 à 08:34
Merci pour toutes ces idées! Je suis en train de préparer l'upgrade... Je la mettrais en ligne dans la journée...
@+ et bonne prog ;-)
cs_dragon
Messages postés2336Date d'inscriptionsamedi 14 juillet 2001StatutMembreDernière intervention 5 mai 20096 7 août 2002 à 01:35
vraiment excellent
autre idée
comparer les différente boucle pour une nombre (textbox) fois: do, while, for
connaitre la quantité de mémoire utiliser pour l'exécution (il y a un exemple sur le site pour un utilitaire de gestion de pc, faudrias inclure le code avec une option on/off pour pas trop influencer la vitesse)
l'utilisation de certain ocx comme image ou picture
les différent trie avec une nombre (textbox) de donné
la différence de temps et de mémoire entre des if imbriqué ou un select case
s,il vaut mieux inclu une image dasn un programme vb ou de le loader au démarrage.
le gain de temps de mettre des images en mémoire au lieu des reloader à chaque fois (de toute façon, avec la mémoire qu'on possède sur nos oridnateur, mettre en mémoire, ça change pus grand chose à comparé lire sur le disque qui est très long)
utilisation du timer au lieu de l'API (J'ai toujours utiliser le timer, mais il me semble qu'il y a un API aussi)
les différence entre les type de compilation possible small code ou fast code
les différente option possible non nécessaire pour certain programme lorsqu'on le met en .exe
mettre tout les texte affiché dnas un fichier texte, le loader au démarre pour afficher tout les texte dans le programme prend t'il plus de temps que de tout mettre les texte directement dans VB (ça serait pratique à connaitre pour les logiciel multilangue, si on perd pas trop de temps à l'exécution du programme)
utilisation d'un if pour savoir si on dois faire une action aulieu de l'exécuter est t'il plus rapide. exemple: avec les api getpixel et setpixel, on peut inversé l'image de l'écran de l'ordinateur. Est t'il plus justicieux d'intervertir tout les pixel ou de faire une validation si les 2 pixels sont différent avant de changer (desfois ajouter un petit if, peut accélérer grandement un programme, comme dans ce cas, intervertir 2 pixels identiques, ça fais pas grand chose).
faudrait un exemple, mais j'en ai pas en tête. Utiliser un code extrêment court est pas toujours le plus rapide. mieux vaut faire une boucle mixer avec des if, que de faire pliens de boucle imbriqué.
là, j'ai pus d'idée de d'autres test. J'ai pas le temps de le coder, donc faudrait que quelqu'un le fasse, ça pourrais en aider beaucoup.
cs_Nox
Messages postés415Date d'inscriptionmardi 3 avril 2001StatutMembreDernière intervention26 avril 2008 7 août 2002 à 01:27
ba chez moi c'est le TRUE qui est le + rapide!
c bien ce prog!! 10/10
leneuf22
Messages postés156Date d'inscriptionsamedi 12 janvier 2002StatutMembreDernière intervention 4 mars 20031 6 août 2002 à 21:47
Super ce programme !!
Merci :)
thiosyiasar
Messages postés186Date d'inscriptionlundi 11 mars 2002StatutMembreDernière intervention30 novembre 20103 6 août 2002 à 18:29
Excellente idée, en plus je suis d'accord avec ce que tu dis.
Par contre je ne savait pas pour les méthodes Right, Left.... !!!!! (je vais tester)
Pour le with, c'est vrai qu'il est plus rapide (et plus propre) mais il m'est arrivé de voir des lignes de codes ignorées (sauf en pas à pas). Dans ce cas, j'utilisai une l'objet Selection de Word.Application. (Word2K)
Merci :)
cobra84
Messages postés42Date d'inscriptiondimanche 26 août 2001StatutMembreDernière intervention13 août 2007 6 août 2002 à 16:18
Je mettrais une mise à jour en ligne demain (max12, tu as raison, je vais montrer l'importance du bloc With). J'essaierais aussi de compléter le cours...
Aller @+ ;-)
cs_max12
Messages postés1491Date d'inscriptiondimanche 19 novembre 2000StatutModérateurDernière intervention 7 juillet 2014 6 août 2002 à 15:43
Wow réellement interressant, au plaisir de voir d'autre Update, montre a utiliser les With plutot que des répétition, etc... (Suggestion)
@+
cobra84
Messages postés42Date d'inscriptiondimanche 26 août 2001StatutMembreDernière intervention13 août 2007 6 août 2002 à 15:34
Le cours ainsi que le programme de test ne sont pas complets, Si vous avez des idées, suggestions, faites le moi savoir...
@+ et Bonne Prog ;-)
18 août 2003 à 18:19
23 janv. 2003 à 08:58
juste pour le plaisir : BRAVO !!!
15 nov. 2002 à 19:59
@+ et bonne prog!
15 nov. 2002 à 14:37
15 nov. 2002 à 11:05
C vrai qu'un forum sur l'optimisation serait le bienvenue.
au fait, tu pourrais créer un programme qui optimise automatiquement le code généré par notre pauvre cerveau, non ?
8 août 2002 à 16:56
@ Brushttiii Pok ;-)
8 août 2002 à 13:01
Bon... je vais voir ce que je peux faire avec Right et Left...
Excellente idée !!!
@+
8 août 2002 à 08:54
Aller @+
7 août 2002 à 23:25
7 août 2002 à 22:38
7 août 2002 à 22:33
7 août 2002 à 22:27
7 août 2002 à 17:15
7 août 2002 à 16:26
7 août 2002 à 16:25
Et les gars siou plait, faites gaffe à l'orthographe please ...
Merci à toi cobra84
7 août 2002 à 11:29
@+ ;-)
7 août 2002 à 08:54
Lors de l'utilisation d'un recordset (avec ADO, DAO). Il vaut largement mieux utiliser une boucle For Next que faire une Do Until EOF.
Exemple:
Do Until MyRs.EOF
Me.Text1.Text = MyRs.Fields(1).Value
MyRs.MoveNext
Loop
EST BEAUCOUP PLUS LENT QUE
Dim RecCount As Long
Dim I As Long
MyRs.MoveLast
MyRs.MoveFirst
RecCount = MyRs.RecordCount
For I=1 to RecCount
Me.Text1.Text = MyRs.Fields(1).Value
MyRs.MoveNext
Next I
La 2e façon de faire est plus rapide que la première. Ceci est du au fait qu'il n'y a pas de vérification de fin de fichier à chaque passage dans la boucle. Ceci est surtout probant pour des jeux d'enregistrements conséquents, comme pour beaucoup d'autres exemples.
Certes la 2e façon de faire est plus longue en code, mais sachez qu'en VB, le code le plus court n'est pas forcément plus rapide à l'exécution.
Les instructions du type: IIF, CHOOSE, SWITCH, REPLACE,... sont très certainement plus lentes que si on les avait écrite nous mêmes. Mais c'est vrai qu'à l'écriture du code, c'est beaucoup plus rapide à 'pondre'.
J'ai lu aussi qu'il était plus judicieux d'utiliser des variables de type LONG au lieu de l'INTEGER. VB6 fonctionnant en 32 bits, celui-ci serait plus optimal avec la gestion du type LONG, ce qui me correct comme raisonnement.
Bonne prog à toutes et àtous...
NéoB
7 août 2002 à 08:34
@+ et bonne prog ;-)
7 août 2002 à 01:35
autre idée
comparer les différente boucle pour une nombre (textbox) fois: do, while, for
connaitre la quantité de mémoire utiliser pour l'exécution (il y a un exemple sur le site pour un utilitaire de gestion de pc, faudrias inclure le code avec une option on/off pour pas trop influencer la vitesse)
l'utilisation de certain ocx comme image ou picture
les différent trie avec une nombre (textbox) de donné
la différence de temps et de mémoire entre des if imbriqué ou un select case
s,il vaut mieux inclu une image dasn un programme vb ou de le loader au démarrage.
le gain de temps de mettre des images en mémoire au lieu des reloader à chaque fois (de toute façon, avec la mémoire qu'on possède sur nos oridnateur, mettre en mémoire, ça change pus grand chose à comparé lire sur le disque qui est très long)
utilisation du timer au lieu de l'API (J'ai toujours utiliser le timer, mais il me semble qu'il y a un API aussi)
les différence entre les type de compilation possible small code ou fast code
les différente option possible non nécessaire pour certain programme lorsqu'on le met en .exe
mettre tout les texte affiché dnas un fichier texte, le loader au démarre pour afficher tout les texte dans le programme prend t'il plus de temps que de tout mettre les texte directement dans VB (ça serait pratique à connaitre pour les logiciel multilangue, si on perd pas trop de temps à l'exécution du programme)
utilisation d'un if pour savoir si on dois faire une action aulieu de l'exécuter est t'il plus rapide. exemple: avec les api getpixel et setpixel, on peut inversé l'image de l'écran de l'ordinateur. Est t'il plus justicieux d'intervertir tout les pixel ou de faire une validation si les 2 pixels sont différent avant de changer (desfois ajouter un petit if, peut accélérer grandement un programme, comme dans ce cas, intervertir 2 pixels identiques, ça fais pas grand chose).
faudrait un exemple, mais j'en ai pas en tête. Utiliser un code extrêment court est pas toujours le plus rapide. mieux vaut faire une boucle mixer avec des if, que de faire pliens de boucle imbriqué.
là, j'ai pus d'idée de d'autres test. J'ai pas le temps de le coder, donc faudrait que quelqu'un le fasse, ça pourrais en aider beaucoup.
7 août 2002 à 01:27
c bien ce prog!! 10/10
6 août 2002 à 21:47
Merci :)
6 août 2002 à 18:29
Par contre je ne savait pas pour les méthodes Right, Left.... !!!!! (je vais tester)
Pour le with, c'est vrai qu'il est plus rapide (et plus propre) mais il m'est arrivé de voir des lignes de codes ignorées (sauf en pas à pas). Dans ce cas, j'utilisai une l'objet Selection de Word.Application. (Word2K)
Merci :)
6 août 2002 à 16:18
Aller @+ ;-)
6 août 2002 à 15:43
@+
6 août 2002 à 15:34
@+ et Bonne Prog ;-)