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

SL & STL C++ Discussion :

Cout de l'allocation dynamique


Sujet :

SL & STL C++

  1. #1
    Membre habitué Avatar de harsh
    Inscrit en
    Février 2005
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 229
    Points : 193
    Points
    193
    Par défaut Cout de l'allocation dynamique
    Bonjour,

    Je voudrais avoir des précisions sur le cout de l'allocation dynamique d'une tableau 2D de la taille d'une image ( disons 640 * 480 ) en terme de temps.

    Mon probleme est le suivant, ma fonction a besoin d'un tableau temporaire pour son traitement. Le plus efficace serait de l'allouer dynamiquement une fois pour toutes dans la fonction appellante et de le passer en parametre a chaque appel. Mais je ne trouve pas ca propre pour une fonction réutilisable.

    De quel ordre est donc la perte en comparaison à la meme fonction allouant dynamiquement son tableau a chaque appel... Mieux, en comparaison a la meme fonction allouant une fois un tableau static?

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Rien que de remplir chaque pixel prendra déjà 100x plus de temps que de les allouer. Tu es sûr que c'est sur le temps d'allocation de la mémoire que se situe le problème (pour peu qu'il y en ait un) ?

  3. #3
    Membre habitué Avatar de harsh
    Inscrit en
    Février 2005
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 229
    Points : 193
    Points
    193
    Par défaut
    Non, il n'y pas de probleme, c'est une question a titre informative. On entend toujours ca et la des remarque sur l'allocation dynamique ou sur l'utilisation de variables static, alors je me pose naturellement des questions.

    Merci

  4. #4
    tut
    tut est déconnecté
    Membre averti
    Avatar de tut
    Inscrit en
    Juillet 2002
    Messages
    373
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 373
    Points : 394
    Points
    394
    Par défaut
    bah, essaye de faire un benchmark, tu verras bien....
    Ca prend "logiquement" plus de temps de faire de l'allocation dynamique, parce qu'à chaque fois tu te coltines la recherche d'un bloc à allouer, la mise à jour de la mécanique nécessaire pour l'allocation, etc...
    Alors qu'en static, il n'y a pas tout ça.
    Pour le quantifier, c'est difficile, ça dépend de la taille du bloc, de l'OS, de la fragmentation de la mémoire, etc....
    Donc, pour avoir un ordre d'idée, fais un test.

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Pourquoi tu veux faire de l'allocation dynamique ?
    Pourquoi ne pas déclarer un tableau à la place ?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Points : 307
    Points
    307
    Par défaut
    Citation Envoyé par tut
    Pour le quantifier, c'est difficile, ça dépend de la taille du bloc, de l'OS, de la fragmentation de la mémoire, etc....
    Et aussi du compilateur et des instructions avant et après et de l'état de ton processus au moment de l'appel et du sens du vent et de l'age du capitaine. L'optimisation que tu proposes est à un niveau tellement bas qu'il vaut mieux attendre de voir si ça freine trop le reste de ton programme.

    L'optimisation prématurée, c'est maaaaaaal. Plus sérieusement, tu risque de perdre en clarté du code pour optimiser au maximum un poil de mouche qui ne sert à rien.

  7. #7
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par roulious
    L'optimisation prématurée, c'est maaaaaaal. Plus sérieusement, tu risque de perdre en clarté du code pour optimiser au maximum un poil de mouche qui ne sert à rien.
    non monsieur, Tut a parfaitement raison ; faire des allocations continuellement cela fragmente la mémoire .
    Il faut une bonne fois pour toute allouer le bloc mémoire

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Points : 307
    Points
    307
    Par défaut
    Citation Envoyé par mat.M
    Tut a parfaitement raison ; faire des allocations continuellement cela fragmente la mémoire . Il faut une bonne fois pour toute allouer le bloc mémoire
    Cela peut fragmenter la mémoire : dans la mesure où on n'a absolument aucun moyen de contrôler les instructions générées par le compilateur, on ne sait pas ce qui se passe par derrière. De plus, harsh parle d'images plutôt petites par rapport à la quantité de RAM sur les machines actuelles et ne précise pas le but de son programme. Si il fait de l'acquisition en temps réel, ça peut éventuellement gêner. S'il fait du traitement d'images, le coût des algo est tellement supérieur à celui de l'allocation que la différence ne sera pas visible.

    Si son programme tourne suffisamment vite par rapport à ce dont il a besoin, pourquoi aller essayer de gagner quelques milisecondes, qui risquent en plus d'introduire des bugs supplémentaires ?

  9. #9
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    De plus, harsh parle d'images plutôt petites par rapport à la quantité de RAM sur les machines actuelles
    Euh ça fait quand même près de 2 Mo...

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Points : 307
    Points
    307
    Par défaut
    Citation Envoyé par loufoque
    Euh ça fait quand même près de 2 Mo...
    Je travaille depuis un bout de temps sur des images médicales, donc je suis un peu biaisé. Pour moi, les images classiques font plus 200 ou 300 Mo que 2Mo. En admettant effectivement que son image soit stockée sur 48 bits (1.7 Mo par image), on est quand même loin des 256 Mo qui semblent être un minimum vital sur les machines actuelles.

    Mais tout ça ne change rien à mon point de vue sur l'optimisation, puisque harsh parlait uniquement de temps (je suis têtu ) : tant que le programme tourne suffisamment, pas la peine d'optimiser. Par contre, si l'allocation prend trop de temps par rapport à ce qui est demandé, le fait de mettre le tableau en statique (dans la fonction ou ailleurs) pourra peut être aider. Mais mieux vaut profiler avant.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Points : 542
    Points
    542
    Par défaut
    La gestion de la mémoire reste un fondamental.
    Et même si ça peut aussi être un secteur d'optimisation en fin de développement, attendre ce moment là pour se poser la question de quelle méthode est la plus adaptée ne me parait pas être une façon très avisée de programmer.

  12. #12
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 279
    Points : 11 015
    Points
    11 015
    Par défaut
    En supposant que le problème soit avéré -- car un programme qui va vite dans un mur n'a que peu d'intérêts.

    Le statique n'est pas une solution qui me plaise. A cause de la non ré-entrance -- OK, je bosse dans des contextes multi-thréadés et temps-réel

    Dans les pistes:
    - s'il s'agit d'allouer des zones de résultat, alors tu peux très bien passer un vecteur (ou autre type matriciel) en [out]. A chaque appel de la fonction, tu fais alors un resize. Avec éventuellement un clear avant si tu veux forcer la RAZ.

    - s'il s'agit d'avoir des zones de travail temporaires énormes. Tu peux voir à utiliser et exploiter un pool de matrices images. Du coup, au lieu de faire un véritable new, tu vas à la place réutiliser un buffer qui n'a jamais été véritablement libéré.

    - en alternative au pool, tu peux avoir des objets algorithmes qui maintiennent les grosses variables qu'ils utilisent pour les calculs intermédiaires. Ainsi, chaque thread peut avoir son propre objet algorithme, ce qui offre une réentrance partielle, mais généralement suffisante.

Discussions similaires

  1. probleme d'allocation dynamique
    Par vince3320 dans le forum C
    Réponses: 10
    Dernier message: 22/04/2004, 16h27
  2. petit pbm allocation dynamique de stringGrid
    Par AnneOlga dans le forum C++Builder
    Réponses: 10
    Dernier message: 17/01/2004, 11h59
  3. Allocation dynamique de structures
    Par fr_knoxville dans le forum C
    Réponses: 8
    Dernier message: 06/05/2003, 21h59
  4. Allocation dynamique de mémoire en asm
    Par narmataru dans le forum Assembleur
    Réponses: 7
    Dernier message: 17/12/2002, 22h31
  5. Réponses: 4
    Dernier message: 03/12/2002, 16h47

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