violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 2010
-
10 déc. 2005 à 23:47
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 2014
-
15 déc. 2005 à 10:09
Violent Ken
Bonjour !
J'ai un problème (sinon je poserais pas de question :-)) : mon application me prend 42Mo de mémoire virtuelle ce qui est déraisonnable. Mon application n'est pas un jeu directX ou quoi que ce soit de gourmand, c'est juste qu'il y a beaucoup de form et de modules. Connaitriez vous quelques astuces pour diminuer la consommation en ressources ? J'ai déclaré, par exemple, que le strict minimum en 'Public', le reste en 'Private'. De même, j'ai bien déclaré toutes mes variables pour prendre le moins de place possible. Que puis je faire d'autre ??
Je sais que c'est un peu flou comme question, n'hésitez pas à me posez des questions si vous voulez des informations complémentaires.
Merci
@+
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013131 11 déc. 2005 à 08:10
Ben là, dit comme cà, c'est sûr qu'on va pas pouvoir t'aider.
Déjà, évite d'utiliser trop d'images, de mettre des fichiers dans
les ressources de ton app, essaye de décomposer ton application en dll
activeX (ce qui te permet de charger/décharger les form à la demande),
de bien désallouer toute la mémoire allouée après utilisation (image,
fichier, base de données, etc.)
_____________________________________________________________________
DarK Sidious
Un API Viewer (pour le VB, VB.NET, C, C# et Delphi) tout en français : www.ProgOtoP.com/popapi/
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 20102 11 déc. 2005 à 12:05
Violent Ken
DARKSIDIOUS ==> merci pour les conseils. Et au fait, depuis le temps que je vois "Un API Viewer (pour le VB, VB.NET, C, C# et Delphi) tout en français : www.ProgOtoP.com/popapi/", je me suis enfin décidé à le télécharger ! Pratique, vraiment !
@+
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013131 11 déc. 2005 à 13:32
lol, oui j'en fait de la pub depuis belle lurette, mais je pense que ca
vaut le coup : c'est le seul que j'ai vu qui possède autant de
fonctionnalité (c'était mon but premier de toute façon).
Malheureusement, je n'ai plus le temps de le développer, et il risque
rester en version bêta avec quelques bugs par ci par là :(
_____________________________________________________________________
DarK Sidious
Un API Viewer (pour le VB, VB.NET, C, C# et Delphi) tout en français : www.ProgOtoP.com/popapi/
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 20102 12 déc. 2005 à 19:55
Violent Ken
Salut PCPT. Merci pour les conseils. En effet, set....=nothing est pratique et permet de libérer quantité d'espace pour les grandes formes déchargées. Quand à l'affectation d'une string nulle à une variable tampon, c'est aussi une idée qui permet d'économiser bcp de mémoire.
J'ai une question : mieux vaut déclarer plusieurs fois dans le prog. les mêmes api,ou bien mieux vaut il les déclarer une bonne fois pour toutes en début de programme ? Autre question, mieux vaut n'avoir qu'un module, quitte à ce qu'il fasse 9000 lignes, ou bien mieux vaut il avoir 30 modules différents ? Ca change quelque chose ?
Merci en tout cas.
@+
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 12 déc. 2005 à 20:25
salut,
pour 1 ou 50000 modules, aucune importance (si ce n'est la lisibilité).
par contre, déclarations des API, j'avais remarqué une sensible différence d'utilisation ressources.
si c'est pour utiliser de temps en temps (proportion) quelques API, et d'autres plus souvent, etc... tu peux toutes les déclarer (donc
en public) dans un module. seulement, çà va consommer un peu plus.
le mieux (conseil testé mais uniquement basé sur mon avis) est de
déclarer le plus d'API en privé, donc uniquement dans les modules
concernées.
et si 2 3 de tes modules utilisent les mêmes, préfère 2 3 déclarations private qu'une public.
le mieux étant (selon l'usage) de les déclarer en module de classe, afin de détruire les instances à la fermeture.
note pour les autres lecteurs : ces points de détail ne portent pas préjudice pour les petits projets.....
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 20102 12 déc. 2005 à 20:51
Violent Ken
PCPT ==> "si 2 3 de tes modules utilisent les mêmes, préfère 2 3 déclarations private qu'une public". Et bien je vais suivre ton conseil, même si çà me semble un peu bizarre.
Une petite question : quelle est la différence entre :
Dim Variable$
et
Dim Variable as string
C'est la même chose ou pas ? Est-ce seulement la lisibilité qui change, ou cela a un impact sur les performances/utilisation de la mémoire ?
Dernière chose : existe t-il des "trucs" en VB style :
Division_Entiere=(A\B) plutot que Division_Entiere=Int(A/B)
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 12 déc. 2005 à 21:36
PCPT a écrit :
n'utiliser que des Long (pas de Integer) (on est en 32bits !!!)
Bah pourquoi ??
Dans ton cas, si tu as des tableaux d'entiers inférieurs en valeur absolue à 32760, je te conseilerai d'utiliser le type integer.
Pour ce que je connais des processeurs, la différence de vitesse sera infime voire meilleur pour les Integer (Il vat simplement préfixer les instructions, non ?).
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 12 déc. 2005 à 21:59
non, int est une restrinction de long. de par le fait, il demande plus
d'effort inutile (infime, on est d'accord...) que le long.
les processess sont en 32, bientôt tous en 64...
on peut comprendre cette différence concrètement face au problème des api (à déclarer en int au lieu de long sous .net 32 // 64)
maintenant, il ne faut pas oublier qu'on parle d'optimisation pour un projet qui "bouffe" trop.
tout en sachant que 42Mo .... je suis actuellement sous FireFox qui m'en prend 27. à comparer....
le int prendra donc (en réalité) la même taille que le long, mais le
process devra faire l'effort de bloquer au max int, donc bien un effort
inutile, n'apportant néanmoins aucun gain de place mémoire
Le compilo préfixe simplement les opérations sur 16 bits (66).
Donc le code n'est donc probablement pas plus lent.
Et l'archi AMD64 intègre le 16 bits aussi bien que l'archi IA32: simple allongement des registres.
Les Integer prennent deux fois moins de place en mémoire.
Donc si on souhaite limiter sa consommation de RAM, il faut mieux remplacer ses tableaux de Long par des tableaux d'Integer, quand c'est possible.
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 14 déc. 2005 à 16:26
je ne sais si cette taille de préfixe joue (impliquant, si c'est le cas,
une taille supérieure pour l'integer...), mais compare également en
correspondance à Java.... tu me diras, c'est un peu particulier
(décimales, etc...), mais le principe est le même (Int Java = Long VB).
Et cette info du Int vs Long(conseillé pour VB), je ne l'ai que lu.
je donnerai suite si je trouve plus d'infos de mon côté.
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 14 déc. 2005 à 18:56
?
Désolé pcpt, je ne vois pas ou tu veux en venir (En plus je connais pas Java)...
Le "mov [edx+2*eax], ax" est catégorique : VB6 progresse dans le tableau d'Integer par étapes de 16 bits.
Et y place ax, soit les 16 bits de poid faibles du registre eax de 32 bits.
Si tu veux, je peux détailler l'assembleur ci-dessus.
Sinon, que les entiers 16 bits tombent en désuétude, c'est fort possible. Mais franchement, à l'heure actuelle, c'est vraiment pas un problème de les utiliser sous VB6.
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 15 déc. 2005 à 10:09
Disons que je vais détailler un peu l'assembleur.
Du point de vue du programmeur, le proceseur travail avec des registres 32 bits (64 bits sous archi AMD 64) et la RAM.
L'assembleur reflète très éxactement ce que fait le processeur : son jeu d' instructions est celui du proce.
1B2D B905000000 mov ecx, 00000005
On met 5 dans le registre ecx.
1B32 33C0 xor eax, eax
On met le registre eax à 0.
On initialise eax avant de l'incrémenter: eax est équivalent à i.
1B34 3BC1 cmp eax, ecx
On compare eax à ecx.
Cette instruction met des flags (Des bits d'un registre) à 0 ou à 1.
Ces flags seront implicitement utilisés lors de l'instruction jg suivante.
1B36 7F10 jg 1B48
On execute l'instruction située à l'adresse 1B48 si eax est strictement supérieur à ecx. Cette instruction arrête donc la boucle pour eax = 6.
1B38 8B55DC mov edx, [ebp-24]
On met la valeur située à l'adresse ebp-24 dans le registre edx. ebp pointe à la base de la pile de constextes. En faite, on récupère l'adresse en RAM du premier integer du tableau dans edx.
1B3B 66890442 mov [edx+2*eax], ax
On met ax dans à l'emplacement edx+2*eax. Autrement dit, on ajoute à l'adresse du premier élément du tableau 2*eax. eax varie de 0 à 5, et la mémoire est accessible au niveau octet. A la première passe, ax est copié à l'adresse pointé par edx, puis edx+2, puis edx+4, puis edx+6, puis edx+8, puis edx+10. La mémoire est acccessible au niveau octet, donc on peut mesurer la taille du tableau : 8*10+16=96 bits = 16*6.
1B3F BA01000000 mov edx, 00000001
On met 1 dans edx.
1B44 03C2 add eax, edx
On additionne eax et edx, et on met le résultat dans eax. Les deux instructions précédentes incrémentent donc eax de 1.
1B46 EBEC jmp 1B34
On boucle: on demende l'execution de l'instruction située à l'adresse 1B34. C'est donc équivlent au Next i.