IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Compresser la mémoire utilisée par un programme


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 11
    Points : 5
    Points
    5
    Par défaut Compresser la mémoire utilisée par un programme
    Salut à tous !

    Actuellement en stage en entreprise, on m'a filé un programme C et on m'a demandé de réduire la mémoire utilisée par ce dernier, qui est actuellement de 98%.

    Bon j'adore le C, mais n'étant qu'en 2°A de DUT GEII, je n'ai pas ces compétences. Je suis donc parti à la recherche d'infos sur internet, mais ça prend du temps donc je viens ici pour avoir un complément, en espérant que vous puissiez m'aider !

    Merci de votre aide !

  2. #2
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 038
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 038
    Points : 8 405
    Points
    8 405
    Par défaut
    salut,

    Citation Envoyé par RedArrrow Voir le message
    on m'a filé un programme C et on m'a demandé de réduire la mémoire utilisée par ce dernier
    moi en lisant ça j'aurais plutot tendance à me pencher sur le code pour essayer de l'optimiser (algorithmiquement) plutot que de vouloir compresser la mémoire

    d'ailleurs au mieux ce sont les données qu'on compresse, pas la mémoire, et si ce sont des données utiles au programme ça veut dire que la compression/décompression plus ou moins régulière va engendrer un coût en terme de charge CPU, à voir si c'est vraiment ça qu'on te demande...

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Ok alors après être allé sur plusieurs forums je me suis rendu compte que je n'avais pas été assez clair.
    En fait je parle d'un programme, qui tourne sur un PIC18 implanté sur une carte électronique.
    Le programme est directement chargé depuis MPLAB via usb sur le PIC (donc pas accès à un exe), et occupe 98% de la mémoire du PIC.
    Ma tâche est de réduire le code pour qu'il prenne moins de place.

    On m'a déjà parlé de padding et d'allocations dynamiques.
    En espérant que tu en ai encore plus à m'apprendre !

  4. #4
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 038
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 038
    Points : 8 405
    Points
    8 405
    Par défaut
    Citation Envoyé par RedArrrow Voir le message
    (...) PIC18 (...) carte électronique (...) MPLAB (...)
    En espérant que tu en ai encore plus à m'apprendre !
    désolé non (effectivement des précisions s'imposaient)

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Bon tant pis, merci quand même !

    Pour les nouveaux arrivant, je reste ouvert à toute proposition !

  6. #6
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 196
    Points : 17 165
    Points
    17 165
    Par défaut
    Regarde dans le forum developpement systeme, il y a une section micro controleurs.

    Vérifie déjà que tu compiles le programme en optimisation pour l'espace.

    Dans tous les cas, améliorer les algorithmes du code devrait permettre de réduire le programme.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Ok merci je vais aller faire un tour sur cette section.
    Je n'ai pas d'option particulière de compilateur.
    Oui j'ai l'impression que c'est la seule solution ...

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 734
    Points : 31 058
    Points
    31 058
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par RedArrrow Voir le message
    Le programme est directement chargé depuis MPLAB via usb sur le PIC (donc pas accès à un exe), et occupe 98% de la mémoire du PIC.
    Ma tâche est de réduire le code pour qu'il prenne moins de place.
    Bonjour

    Il n'y a pas de méthode miracle pour réduire un code. C'est un truc qu'on fait au cas par cas. D'autant plus que maintenant les compilateurs savent optimiser pas mal de truc.

    Citation Envoyé par RedArrrow Voir le message
    On m'a déjà parlé de padding et d'allocations dynamiques.
    En espérant que tu en aies encore plus à m'apprendre !
    L'allocation dynamique éventuellement. Effectivement si le programmeur précédent a défini un tableau de 100000 items (pour être sûr que tout rentre) et qu'il n'est rempli qu'au tiers, alors ça peut-être intéressant de n'allouer que 40000. Mais dans ce cas, c'est à toi de gérer l'allocation/reallocation du tableau lors du remplissage ce qui impose alors un travail rigoureux.
    Le padding c'est essayer d'aligner une structure sur une valeur précise (généralement puissance de 2) afin que le déplacement entre différentes variables de cette structure soit plus rapide. C'est surtout utile quand on a des tableaux de structures. Ca optimise l'accès à tab[i]. Mais est-ce que les compilos ne le font pas déjà tout seul...?

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    D'autant plus que maintenant les compilateurs savent optimiser pas mal de truc.
    T'es en train de me dire que je vais devoir annoncer à mon maître de stage que je ne lui ai fais gagner qu'un pourcent ?

    Bon ben je vais devoir me concentrer sur le padding et l'allocation dynamique si j'ai bien compris.

    Merci pour ta réponse !

  10. #10
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 196
    Points : 17 165
    Points
    17 165
    Par défaut
    Tu vas devoir comprendre ce qui prend de la place.
    Et c'est ca qu'il faudra optimiser.

    Avec un debugger, tu pourrais avoir des informations.
    Bon courage!

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Aller va pour le debugger !

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    J'ai trouvé quelques pistes de mon côté !

    En ouvrant par curiosité les fichiers du dossier de mon projet, je suis tombé sur plusieurs fichiers intéressant.
    Tout d'abord un fichier nommémain.LST: il y a écrit en en-têteROM used : 15106 bytes (92%), Largest free fragment is 1274. Le 1274 signifie qu'il y a un "trou" de 1274 bits en plein milieu ?? (donc possibilité de gagner de la place je présume)

    Ensuite, j'ai ouvert le fichier main.sta : je vous montre pour une meilleure compréhension : main.sta . Ici on voit clairement que le main.c occupe 54% de la ROM, MATH.H 9%, stdlib.h 14% et string.h 4%. Déjà la somme ne fait que 81%, donc on a 11% qui disparaisse je ne sais où. Première idée que j'ai, tout simplement commenter les fonctions non utilisées des bibliothèques math, stdlib et string. Je pense qu'il y a moyen de gagner 4-5%. Si vous reprenez l'image juste au-dessus, il y a un tableau avec les colonnes Page, ROM, %, RAM et Functions. Quelqu'un saurait m'expliquer comment le déchiffrer, car je ne sais pas de quel pourcentage on parle.

    Finalement j'ai ouvert le fichier main.tre : pour une meilleure compréhension : main.tre . J'ai un doute quand à son rôle, j'ai l'impression qu'on a ici l'utilisation de la RAM par chaque fonction (ce qui m'intéresse pour la suite), mais si l'on prend l'exemple de la fonction Read_EEPROM, je ne saisis pas la signification du 0/152. J'imagine que le Ram=9 veut dire 9 octets stockés sur la RAM ?


    L'idée sur laquelle je pars du coup c'est essayer de gagner de la place sur les fonctions non utilisées des librairies, et ensuite tester la mémoire occupée par chaque fonction du main, et tester des modifications pour voir si je peux en gagner un peu plus.

    J'attends vos réponses pour savoir si c'est viable comme solution, merci !

  13. #13
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 483
    Points : 13 685
    Points
    13 685
    Billets dans le blog
    1
    Par défaut
    C'est un travail très délicat quand on ne connait pas l'application actuelle. Il va déjà falloir que tu commences par bien la comprendre.

    Si cette application a été codée avec les pieds, tu pourras gagner de la place. Sinon, tu ne gagneras sans doute pas grand chose, mais on est toujours à la recherche de quelques centaines de bytes sur PIC.

    Il faut déjà que tu comprennes bien le terme mémoire : quand tu parles de 98 %, je présume que tu parles de la flash (ou ROM) et non de la RAM. Ainsi, l'allocation dynamique (qui sans doute interdite sur un PIC par le compilateur ou par les règles de codage de l'entreprise) n'y est pour rien, car elle utilise de la RAM et non de la ROM.

    Ton compilateur a forcément des options, et souvent les compilateurs une option pour optimiser en taille (-Os avec gcc par exemple).

    Si la flashes est pleine, il faut que tu factorises un maximum de code dans des fonctions. Il existe des outils pour analyser du code source et t'indiquer le pourcentage de duplication de code. Le code dupliqué, c'est du code qui pourrait être dans une seule fonction qu'on appelle depuis plusieurs autres endroits.

    Bon courage.

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Merci Bktero pour ta réponse !

    Ok je corrige la faute que j'ai faite au début du poste, la mémoire est remplis à 92% mais ce n'est qu'un détail.
    Effectivement je parle bien de la ROM et non pas de la RAM.

    l'allocation dynamique (qui sans doute interdite sur un PIC par le compilateur ou par les règles de codage de l'entreprise
    --> pourquoi cela ?
    Ben justement, si j'arrive trouver des variables déclarées en générales, alors qu'elles ne sont utilisées qu'une seule fois, pourquoi ne pas les stocker dans la RAM et les effacer ensuite ?

    Ton compilateur a forcément des options, et souvent les compilateurs une option pour optimiser en taille (-Os avec gcc par exemple)
    --> j'ai 2 logiciels : MPLAB, et l'autre qui s'appelle PIC C Compiler. Quand je compile sous MPLAB je n'ai pas besoin d'ouvrir PIC C Compiler, mais du coup j'imagine que si je veux paramétrer mon compiler faut que j'aille dans PIC C Compiler ? Parce que je l'ai survolé rapidement et j'ai rien vu qui m'intéressait. Après j'ai certainement râté des infos que je n'ai pas saisis.

    Il existe des outils pour analyser du code source et t'indiquer le pourcentage de duplication de code.
    --> t'as un exemple d'outil ?

  15. #15
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 483
    Points : 13 685
    Points
    13 685
    Billets dans le blog
    1
    Par défaut
    J'avais oublié de relever ça :
    Première idée que j'ai, tout simplement commenter les fonctions non utilisées des bibliothèques math, stdlib et string.
    Ne modifie pas ces fichiers ! Ils sont la "propriété" du compilo et un vrai compilateur est évidemment capable de ne pas embarquer les fonctions que tu n'utilises pas.

    --> pourquoi cela ?
    Ben justement, si j'arrive trouver des variables déclarées en générales, alors qu'elles ne sont utilisées qu'une seule fois, pourquoi ne pas les stocker dans la RAM et les effacer ensuite ?
    En général, on évite l'allocation dynamique sur de l'embarqué enfoui, car il est difficile de savoir si un jour on ne va pas être à court de mémoire et faire planter le système.
    Une variable est presque toujours en RAM. Il n'y a que les constantes qui peuvent se retrouver en flash. Probablement peu de gain par là, sauf à les rendre non constantes ce qui n'est pas une excellent idée.

    --> j'ai 2 logiciels : MPLAB, et l'autre qui s'appelle PIC C Compiler. Quand je compile sous MPLAB je n'ai pas besoin d'ouvrir PIC C Compiler, mais du coup j'imagine que si je veux paramétrer mon compiler faut que j'aille dans PIC C Compiler ? Parce que je l'ai survolé rapidement et j'ai rien vu qui m'intéressait. Après j'ai certainement râté des infos que je n'ai pas saisis.
    Il faut vraiment tu saches quel compilateur est utilisé. Ton maitre de stage devrait être capable de répondre à cette question. Quand vient le moment d'optimiser, on s'appuie aussi sur ses capacités et ses options.

    --> t'as un exemple d'outil ?
    En Java, j'utilise SonarQube. On peut l'utiliser avec d'autres langages. Tu peux chercher d'autres outils qui détectent la duplication de code sur internet.

  16. #16
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 684
    Points : 188 860
    Points
    188 860
    Par défaut


    Pour avoir dû les tester, je ne dirais pas que les compilateurs Microchip gratuits sont exceptionnels… La version pro effectue énormément d'optimisations (à peu près zéro en gratuit), notamment pour gagner de la place, c'est d'ailleurs pour ça qu'elle est payante (~ 500 - 1000 € la licence). Maintenant, ça m'étonnerait qu'il existe des tonnes d'autres compilateurs que XC8.

    Sur les bibliothèques standard : bien évidemment, le compilateur n'inclut pas le code de toutes les fonctions. Maintenant, tu peux envisager de réimplémenter certaines fonctions qui prennent trop de place. Exemple : si tu utilises un sinus codé avec une LUT de très grande taille sans avoir besoin d'une grande précision, tu peux recoder le tout avec un polynôme de Taylor (par exemple, voir musl : http://git.musl-libc.org/cgit/musl/tree/src/math/sin.c, http://git.musl-libc.org/cgit/musl/t...c/math/__sin.c ; à comparer avec la glibc, absolument pas prévue pour de l'embarqué : https://sourceware.org/git/?p=glibc....4/s_sin.c#l283).

    Maintenant, il y a sûrement de meilleures sources d'optimisation que la bibliothèque standard, à voir selon ton cas.

  17. #17
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Solution trouvée !
    Tout simplement en lisant la datasheet du compilateur, j'ai trouvée une option, #OPT n
    avec n allant de 1 à 11 et qui permet de choisir le niveau d'optimisation du code !
    J'ai pu donc passer de 92% à 71% !
    Merci à tous !

  18. #18
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 483
    Points : 13 685
    Points
    13 685
    Billets dans le blog
    1
    Par défaut
    Je dis souvent que quand vient le temps de l'optimisation, vient avec lui le temps du travail du compilateur

    Penses à revalider ton logiciel : avec un haut niveau d'optimisation, tu n'as pas forcément le même comportement. Il peut déjà y avoir des erreurs du compilateur qui "optimise trop" et ne respecte plus tout à fait ton code. Il peut y avoir des timings différents, un exemple classique étant les délais faits avec des boucles (ce qui est souvent une idée "moyenne" car peu portable et justement souvent dépendantes des optimisations si la réalisation est mauvaise).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Mémoire utilisée par un programme c++
    Par xavierdestev dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 03/01/2014, 21h13
  2. mémoire maximale utilisée par un programme
    Par xavierdestev dans le forum Débuter
    Réponses: 4
    Dernier message: 26/12/2013, 22h53
  3. Mémoire utilisée par un programme
    Par Deamon dans le forum Général VBA
    Réponses: 2
    Dernier message: 13/05/2009, 11h41
  4. Utilisation de la mémoire vive par un programme
    Par Pixcoder dans le forum C++
    Réponses: 13
    Dernier message: 25/09/2006, 12h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo