TUTORIEL OPTIMISATION AVANCÉES : COMPILATION, COMPILATEUR ET APIS

Afyn Messages postés 608 Date d'inscription samedi 3 août 2002 Statut Membre Dernière intervention 22 décembre 2016 - 6 sept. 2003 à 15:48
vincentClimber Messages postés 20 Date d'inscription jeudi 25 novembre 2004 Statut Membre Dernière intervention 3 mai 2006 - 2 mars 2005 à 11:15
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/8470-tutoriel-optimisation-avancees-compilation-compilateur-et-apis

vincentClimber Messages postés 20 Date d'inscription jeudi 25 novembre 2004 Statut Membre Dernière intervention 3 mai 2006
2 mars 2005 à 11:15
ok,
merci bien Afyn.
Afyn Messages postés 608 Date d'inscription samedi 3 août 2002 Statut Membre Dernière intervention 22 décembre 2016
1 mars 2005 à 23:08
c'est déjà répondu ...

Supprimer les contrôles de limites de tableaux :
prenons un exemple : "dim tabl(1 to 1000) as long: for i 1 to 1000: tabl(i) i*2: Next". Lorsque le code est compilé, avant l'instruction "tabl(i) =" il y a un test pour savoir si "i > 1000" et si c'est le cas, le programme appelle __vbaGenerateBoundsError, générant une erreur pouvant être intercepté via "On Error...", pour éviter le "seg fault" (tentative d'accès à une zone mémoire non alloué/autorisé). Bref, si on ne coche pas cette case, cela reviendrai a faire un "If i > UBound(tabl()) Then Err.Raise" avant chaque appel dans un tableau!! (collection d'objets inclus). En conclusion, si votre programme utilise un tableau, et si vous ne risquez pas de "dépasser" ce tableau, cochez cette case! vous y gagnerez assurément en performances!

Bien lire ...

Afyn - Navedac

Au fait peut etre rajouter un couplet sur les collections ?
C'est aussi de l'optimisation
vincentClimber Messages postés 20 Date d'inscription jeudi 25 novembre 2004 Statut Membre Dernière intervention 3 mai 2006
1 mars 2005 à 09:59
Merci Afyn de m'avoir répondu, mais je ne comprends pas ce que je dois faire (les checks??)...
Pourrais tu m'expliquer brièvement parceque je sèche.
Ca me serait tres utile, je pense - Merci -
Afyn Messages postés 608 Date d'inscription samedi 3 août 2002 Statut Membre Dernière intervention 22 décembre 2016
25 févr. 2005 à 20:57
Oui ... l'optimisation enlève les check sur les tableaux
tu dois toi même faire les checks.

Afyn - Navedac
vincentClimber Messages postés 20 Date d'inscription jeudi 25 novembre 2004 Statut Membre Dernière intervention 3 mai 2006
23 févr. 2005 à 16:59
Super,
je croyais trouver la réponse à mon pb, mais non...

En fait moi j'ai une appli qui a des gros tableaux de structures alloué dynamiquements, et ça marche niquel en lançant l'appli en debug.
Mais quand je génère l'exe (fast code) ca plante à l'execution (depassement de tableau).
Par contre, quand j'enleve l'optimisation fast code, ca marche bien...
J'comprends pas, à non j'comprends pas!

QQ1 a une idée ???
Merci d'avance..
Silmon Messages postés 85 Date d'inscription mardi 6 janvier 2004 Statut Membre Dernière intervention 7 mai 2007
17 févr. 2005 à 18:08
dalefou/
pour repondre a ta question, 2 suggestions:

1/ place un control imagelist dans ton project et introduis tes icones.


2/ cherche du cotés des resources files
Tu peux inclure dans ton exe des fichiers tels que des icons a travers le resource file. Toutefois, les icones sont converti en image (je crois).
Pour acceder a une image utilise la fonction LoadResPicture

Une derniere chose pour la discretion, il existe des fonctions api
pour "lire" le resource file d'un exe. Mais faut savoir!

J'espere que ça t'aidera.


/Proger

bravo 10/10
Une question: je pensais que le byval etait toujours plus rapide que le byref, mais cela dependrait du tipe de l'argument (string , control...) ?
cs_Labuzz Messages postés 13 Date d'inscription samedi 25 décembre 2004 Statut Membre Dernière intervention 11 avril 2005
25 déc. 2004 à 12:23
En fait, dans l'entreprise dans laquelle je taff y'a un mini reseau ( une vingtaine de postes et un serveur "Small Business Server 200X").

Mon projet est stocke directement sur le server.
Quand je taff dessus, je l'ouvre directement depuis mon poste et fais mes modif et j'enregistre sur le server.
Donc quand je compile, le fichier .exe est stocker sur le serveur aussi.

C'est quand je copie-colle la version .exe sur mon poste ke j'obtient ce runtime error 6 "OverFlow" venu du fin fond de l'espace.

Faut dire que tout marchait nikel au debut, mais depuis que j'ai remplacer quelques integers par des longs, chak fois ke je lance un certaine function je me paye ce BiIIIIIP de overflow.

Alors je me disait que ce windows de BIIIP gardait le meme espace en memoire pour les variables malgre ke G change les dimension alors G efface le fichier exe de mon poste, g redemarrer (Apres 25 sec etant eteint) et la BIm bam Boum ! C'est la meme galere !

:( a l'aide !!!

Sinon l'executable qui est stocker sur le server marche nikel et pourtant je le lance a partir de mon poste, c'est ke kan je la copie sur mon poste que ca foire

Need Help THX
Afyn Messages postés 608 Date d'inscription samedi 3 août 2002 Statut Membre Dernière intervention 22 décembre 2016
25 déc. 2004 à 10:49
-> Labuzz ?

Ben sans le code c'est pas facile de t'aider !
C'est normal qu'il y ait des différences entre un projet
compilé et non compilé.

Joyeux Noël à tous

Afyn
Navedac
cs_Labuzz Messages postés 13 Date d'inscription samedi 25 décembre 2004 Statut Membre Dernière intervention 11 avril 2005
25 déc. 2004 à 07:35
Salut,

Voila je taff sur un projet Visual Basic 6 qui est maitenant fini (theoriquement), le programme cartonne, fluide 0,000 erreur dans le code.
Mais voila le bad ! quand je lance la version Compliee (.exe) de mon code, je trouve un vieux runtime error 6 (overflow) qui viens de nulle part. Cette erreur occur a 100%.
Cependant cette erreur est inimaginable est meme inexistante sous l'IDE de vb.
J'ai deja teste toute les options de compilation mais le problem demeure.
C pourquoi je demande de l'aide a la communaute dea developper en esperant que pour cette fois qu moins, je sois pas le premier ni le seul a rencontrer ce probleme
Joyeux noel tous, moi je bosse today, Pensait a moi !
Neo.balastik Messages postés 796 Date d'inscription jeudi 17 mai 2001 Statut Membre Dernière intervention 5 mai 2009 7
26 nov. 2004 à 21:24
Plus d'un an après, je dis BRAVO !!! Super intéressant, moi qui utilise VB depuis sa version DOS !
cs_dalefou Messages postés 3 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 24 août 2004
24 août 2004 à 12:20
Bonjour, juste une question ca a surement déjà été abordé d'aileurs ... ?
Je voulais savoir si il y avait un moyen d'embarquer un rép dans un compilé ?
je m'explique, dans mon projet je fais appel à des icones pour construire un menu et je voudrai ne pas avoir a laisser a dispo des utilisateurs le rép contenant les icones ... Je voulais donc savoir si on pouvait "embarquer" les fichiers avec l'exe ???? C'est à dire ne plus avoir besoin de les stocker quelque part ...

merci d'avance.

Dalefou
Egalon Messages postés 124 Date d'inscription lundi 26 avril 2004 Statut Membre Dernière intervention 17 juin 2011
5 août 2004 à 11:35
Très intéressant tout cà....
Je suis tombé dessus par hasard et j'utiliserai ces options maintenant.
(Et pis d'ou tu sais tout ces trucs??? J'ai jamais lu ça ailleurs )

Merci d'étancher notre soif de Connaissance ;-).

Ca vaut un 10/10.
DeadlyPredator Messages postés 222 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 30 juin 2008
4 août 2004 à 21:30
hélas, vb fait vraiment pitié comparé à Delphi. En Delphi, les apis sont appelées directement mais, quand on utilise les feuilles avec delphi 7, on ne peut pas avoir un exe plus petit que 200Ko...
cs_Warning Messages postés 516 Date d'inscription samedi 3 février 2001 Statut Membre Dernière intervention 24 octobre 2006 2
8 avril 2004 à 16:03
Salut, je rajouterais ossi un petit truc qui m'a vraiment étonné:

If condition then
beep
beep
beep
beep
else
beep
beep
end if

se transforme en

If condition then
beep
beep
end if
beep
beep

après compilation....

J'ai découvert ça au cour de mon étude sur la compilation pour la création de mon logiciel VBReFormer qui pourrait bientot se transformer en decompileur ;) ...

a++

wArning

http://www.decompiler-vb.tk/
cs_phenix2000 Messages postés 6 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 13 mai 2004
2 mars 2004 à 15:07
Salut...

Ben, je suis qu'un petit débutant sous VB6 et je tenais à remercier les personnes qui partagent leurs connaissances...

Donc un grand merci pour toi PROGER pour toutes ces explications et évidement merci à VBFRANCE.COM...

Voilà, bonne continuation...
cuq Messages postés 345 Date d'inscription mardi 3 juin 2003 Statut Membre Dernière intervention 21 mars 2008 2
15 janv. 2004 à 11:11
Bonjour,

Très intéressant, J'ai justement un programme en cours avec beaucoup d'opération mathématique et d'affichage et il me parait intéressant de passer à une phase d'optimisation avant de poursuivre le dev.

Quelques questions me viennent à l'esprit :
Dans le tutorial il y a une partie traitant la compilation mais je n'ai pas ces options sous VB6 ces conseils étaient uniquement pour VB5 ou resteent valable sous VB6.

Autres point J'utilise beaucoup de notation pour des points 3D

'---------------------
' Point en 3D
'---------------------
Public Type Point3
X As Double
Y As Double
Z As Double
End Type

est-il plus souhaitable dutiliser cette notation ou un tableau du type
Public Pt3D(2) as double ?

autre cas je récupère via une fonction un tableau du type
Matrix(1 To 16) As Double

et dans les calcul matricielle je réutilise une ancienne fonction avec une matrice type Dim Matrice(2, 2) As Double

Je suis donc obligè de réaffecter les valeurs serait -il préférable de garder la même notation a savoir Matrix(1 To 16) pour faire les calculs ?

J'ai encore milles questions mais on va pas abuser

Merci
Xya Messages postés 103 Date d'inscription lundi 8 juillet 2002 Statut Membre Dernière intervention 24 novembre 2005
1 nov. 2003 à 15:40
Pour VB.NET le code est d'abord transformé en langage IL (pseudo-assembleur) par le compilateur vb et c'est ce code IL qui est écrit dans l'exécutable. Quand on lance le programme le code IL est compilé à la volée en assembleur natif par le compilateur .net (JIT) qui se charge de toutes les optimisations (code spécifique à certains processeurs, mise inline de certains fonctions, ...), ce qui fait que tout ce qui n'est pas exécuté n'est pas compilé par JIT.

Un contrôle VB.NET sera plus rapide qu'un même contrôle VB mais l'appeler par VB a un prix: on passe de VB à COM (ActiveX) puis à .net, donc une grosse perte de performances. Ca peut être interessant d'appeler un contrôle VB.NET par VB s'il est beaucoup plus rapide que le contrôle VB, mais c'est encore plus lourd pour déployer le programme après, il aura besoin après du runtime VB ET du runtime .net, donc à toi de voir.
Proger Messages postés 248 Date d'inscription vendredi 10 novembre 2000 Statut Membre Dernière intervention 19 décembre 2008
16 oct. 2003 à 13:03
oui, pour la chaine, en byref tu passe le pointeur vers la même chaine, en byval le système copie la chaine et passe un nouveau pointeur au sub. Dans tout les cas, l'accès se fait par un accès en RAM. Je dirais même qu'en byval, comme il faut dupliquer la chaine (alloc de mémoire, puis copie octet par octet) c'est plus long.

Utiliser le type Long plutôt que Integer? ben en fait l'ensemble des opérations logique/arithmétique se fait en utilisant le registre EAX (registre 32bits çàd Long). en désassemblant mes proggy de test vb, j'ai vu que le compilateur essaye toujours d'utiliser EAX, en copiant les variables sur 8 et 16bits dans eax le temps de l'opération, et ce surtout dans le cas de boucles (for next, do loop). Alors pour économiser la micro-conversion, oui, il vaux mieux utiliser le Long.
DefLng A-Z powa ;)
hpfx Messages postés 22 Date d'inscription vendredi 29 août 2003 Statut Membre Dernière intervention 18 novembre 2007
16 oct. 2003 à 12:02
Parfait, excellente reponse, tu as tres bien compris ma question (malgres mon charabia).

bien evidement si c'est une chaine j'imagine que c'est un peu different... ca depends de la taille de la chaine aussi...

comme tu m'a l'air expert en la matiere, est'il vrai qu'il vaut mieux utiliser des Long plutot que des Integer (c'est mieux au niveau du code generé soit-disant) ?

Tres bon article, ca vaut 10 !
je te remercie.
Proger Messages postés 248 Date d'inscription vendredi 10 novembre 2000 Statut Membre Dernière intervention 19 décembre 2008
16 oct. 2003 à 10:38
Code compilé : normalement c'est en byval que ça sera plus rapide SI tu utilises bcp cette variable dans le sub. En effet, le code copiera la valeur dans les registres ou la pile "locale" ce qui est plus rapide d'accès pour le cpu, tandis que dans le cas byref, il faut faire une recherche en RAM à chaque besoin. (mov eax, dword ptr...).
Mais normalement si tu coches des options comme "pas d'utilisation d'alias), le compilateur vb compensera ces problèmes.

sous l'ide, byval et byref, ya pas de différence.
hpfx Messages postés 22 Date d'inscription vendredi 29 août 2003 Statut Membre Dernière intervention 18 novembre 2007
15 oct. 2003 à 23:32
question :
si j'ai un long (ou un interger)
pour le passer a une fonction est-ce plus performant de la passer en ByVal ou en Byref
(le type etant de même taille que le pointeur (buref) mais il n'y a pas de déreferencement à faire)... ceci en dehors de toutes notions du concept de "avec le byref tu peux modifier la varaible" etc.. je sais tout ca, c'est juste pour savoir question perf ?.

merci.
cs_sephiro Messages postés 101 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 18 février 2008
8 sept. 2003 à 08:57
Ce type d'infos est TOUJOURS interressant, c'est complet en restant simple, beau travail , ==> 10.
Proger Messages postés 248 Date d'inscription vendredi 10 novembre 2000 Statut Membre Dernière intervention 19 décembre 2008
6 sept. 2003 à 16:51
Afyn : vb.net ? heu... je ne sais pas comment se comporte le compilateur, jamais exécuté ce truc (j'ai cru comprendre que c'est encore pire que vb question dll) il faudrai faire des benchs.
On peut mettre du code asm dans un projet vb6, mais ... c'est pas vraiment prévu pour.
Pour les evênements, amha on peut pas faire grand chose... les evênements c'est que des callbacks en provenance de fonctions compilé dans les dll et ocx fourni par vb/win32 ... on peut pas les accélérer. En revanche on peut gérer en amon l'appel vers tel ou tel evênement en reduisant les appels vers les objets... Ou alors on fait du multithreading (c cho le multith, mais pas impossible)
cs_OphidiaN Messages postés 235 Date d'inscription mercredi 4 avril 2001 Statut Membre Dernière intervention 9 novembre 2007
6 sept. 2003 à 16:09
hmmm.... on en apprend tjrs avec toi :D
Afyn Messages postés 608 Date d'inscription samedi 3 août 2002 Statut Membre Dernière intervention 22 décembre 2016
6 sept. 2003 à 15:48
2 Questions :

- Un activeX porté de VB6 à VB.net est - il plus rapide? et peut il
etre ré-utilisé dans VB6 (s'il y un gain)?

- Peut on mettre un peu de code asm dans un projet VB6 ?

& 1 remarque

- On passe souvent la main à windows pour gérer les évenements et on passe beaucoup de temps à attendre que windows soit "disposé" à nous la rendre. Y a t il quelque chose à gratter en terme de performance sur les évenements ?
Rejoignez-nous