Mon *exe mange trop de ressources

violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 - 10 déc. 2005 à 23:47
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Derniè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
@+

17 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
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/
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
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 !
@+
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
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/
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
11 déc. 2005 à 23:33
salut Ken,

ummm, un petit (??) gain de place peut aussi de détruire (erase) les tableaux en sortie de Sub et/ou UnLoad de Form.



et également de vider les String volumineuses (genre les tampons, etc...) par une init avec Chr$(0).

le reste après, c'est les Set ... = Nothing.



à froid comme çà, je ne vois que çà

PCPT [AFCK]
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
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.
@+
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
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.....

++

PCPT [AFCK]
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
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)

comme pour A=A+1 ==> A++ en C

Y en a d'autres ??
Merci, bonne prog. et @+
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
12 déc. 2005 à 21:11
Dim Variable$ ........ Dim Variable as
string pure lisibilité
(et rapidité/habitude), aucun impact en compilé.



après, des trucs.... le "" à la place de int/ ou fix/, en effet...

çà sera aussi d'indiquer le format de réception...



exemple, toto string reçoit un code ascii :

préférer toto = Chr$(34) plutôt que Chr(34)



pareil pour les Format, Replace, etc.... (string), pareil double, date, etc....



test de l'autre fois : préférer 3999 And X plutôt que X Mod 4000

parfois préférer le Sleep plutôt que DoEvents (à estimer selon le cas... très particulier!!!!)

(bah ouai, je reste adèpte du DoEvents )



n'utiliser que des Long (pas de Integer) (on est en 32bits !!!)

essayer (selon la lisibilité et le sens du nom attribué) de parfois
réutiliser une même variable (dans la même procédure j'entend)



préférer un tableau de type plutôt que 2 3 dimentions très souvent mal utilisé



si objets (contrôles) chargés dynamiquement, (indéxés ou non), les détruire à la sortie.

(surtout pour être certain que libérer le plus possible de tes 42Mo)



bien vérifier que la sortie de l'appli n'est pas faite pendant une boucle en travail....

utiliser le moins possible de Variant. (aucun au mieux...)



umm, sinon pour les astuces, j'ai rien d'autre sous le coude.....
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
12 déc. 2005 à 21:17
Violent Ken

D'accord. Merci beaucoup pour tous les conseils !
@+
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
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 ?).
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
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
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
12 déc. 2005 à 23:44
Je suis un peu surppris de ce que tu me dis là.
Ma foi, ça me donne envie de faire mumuse avec mon bon vieux TD32.
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
14 déc. 2005 à 15:32
Un code VB6, compilé (Avec un max d'options d'optimisation) puis désassemblé :

Dim tabInteger(0 To 5) As Integer
Dim tabLong(0 To 5) As Long
Dim i As Long

For i = 0 To 5
tabInteger(i) = i
Next i

For i = 0 To 5
tabLong(i) = i
Next i


1B2D B905000000 mov ecx, 00000005
1B32 33C0 xor eax, eax
1B34 3BC1 cmp eax, ecx
1B36 7F10 jg 1B48
1B38 8B55DC mov edx, [ebp-24]
1B3B 66890442 mov [edx+2*eax], ax
1B3F BA01000000 mov edx, 00000001
1B44 03C2 add eax, edx
1B46 EBEC jmp 1B34

1B48 B905000000 mov ecx, 00000005
1B4D 33C0 xor eax, eax
1B4F 3BC1 cmp eax, ecx
1B51 7F0F jg 1B62
1B53 8B55C0 mov edx, [ebp-40]
1B56 890482 mov [edx+4*eax], eax
1B59 BA01000000 mov edx, 00000001
1B5E 03C2 add eax, edx
1B60 EBED jmp 1B4F

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.
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
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é.
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
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.
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
14 déc. 2005 à 22:24
re,

je voulais en venir à "en .net comme en Java, le int est sur 32bits"

j'ai en effet un peu de mal à interpréter ton post assembleur...



je vais me renseigner plus précisément de mon côté.

++

PCPT [AFCK]
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
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.

J'espère t'avoir un peu éclairé...
0
Rejoignez-nous