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 :

Pourquoi Visual Studio est lent sur la gestion de la mémoire?


Sujet :

C++

  1. #1
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut Pourquoi Visual Studio est lent sur la gestion de la mémoire?
    Bonjour à tous,

    Tout est dans le titre!
    J'ai fait un allocateur linéaire pour optimisé les allocations mémoires.
    Pour comparer les performances, je fais un benchmark sur 1 Go alloué via malloc, avec des insertions personnalisé (via "allocator") d'une classe de 28 octets pour 512Mo, soit 19173961 allocations.
    Avec l'allocateur j'arrive à un résultat de 0.16 secondes pour toutes les allocations et pour le free de la mémoire.
    A des fins de comparaison je fait la même chose avec 19173961 new qui me prends 0.91 secondes et autant de delete qui me prend.... bas je sais pas en faite.... au bout de 10 minutes j'étais même pas arrivé à 10 millions de delete et j'ai un bad_alloc sur après quelque Mo de new.
    Mais ce comportement n'est que via Visual Studio. Lorsque je lance le programme hors Visual Studio, le tout ce fait en quelque secondes ( 1 à 2 secondes) sans aucune erreur.
    Savez-vous pourquoi Visual Studio ralenti autant la gestion mémoire? sachant que je compare en Release.

    Merci
    Homer J. Simpson


  2. #2
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    De base, un allocateur mémoire est « généraliste ». Il est moyen en tout. Si tu alloues beaucoup de petits objets, un allocateur personnalisé peut apporter des améliorations de performance.

    Attention, cela peut se faire au détriment de la sécurité : certains allocateurs, par sécurité, nullifient la mémoire qu’ils renvoient : ce ne sera plus le cas, sauf si ton allocateur custom le fait aussi. Ça peut être ou ne pas être un problème suivant les cas (dernier exemple en date :*heartbleed…).

    Pour ce qui est de l’exécution au sein de Visual, même si tu exécutes du code Release, le fait de l’exécuter au sein d’un débogueur fait que ce sera beaucoup plus lent. Rien d’étonnant à ça.

  3. #3
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    De base, un allocateur mémoire est « généraliste ». Il est moyen en tout. Si tu alloues beaucoup de petits objets, un allocateur personnalisé peut apporter des améliorations de performance.

    Attention, cela peut se faire au détriment de la sécurité : certains allocateurs, par sécurité, nullifient la mémoire qu’ils renvoient : ce ne sera plus le cas, sauf si ton allocateur custom le fait aussi. Ça peut être ou ne pas être un problème suivant les cas (dernier exemple en date :*heartbleed…).
    Un allocateur mémoire est « généraliste », oui, le lineaire non! Nullifier la mémoire reviendrait à ralentir l'allocation sans rien apporter.

    Mais le problème ne vient pas de ma compréhension des allocateurs mais de savoir pourquoi le comportement est différent sous Visual et hors Visual en ce qui concerne les new et les delete.
    Si l'on réalise ces allocations via la lanceur de Visual alors je ne serais pas étonné que Visual alloue dans une heap séparée(afin de delete les memory leak par exemple), ce qui pourrait causer ce genre de problème, mais j'aimerais juste avoir la confirmation où le pourquoi de ce comportement
    Car il pourrait tourner plus lentement ça n'explique le bad::alloc lorsque l'on lance dans Visual Studio.

    Merci
    Homer J. Simpson


  4. #4
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    Bien il semblerait que ce soit tout simplement un "Out of Memory" mais que Visual Studio gère bien moins que Windows les nombreuses allocations de petites tailles. Mais Windows le gère très bien car dans le gestionnaire de tâche en lançant 8 fois le programme je n'ai aucun std::badalloc, par contre j'observe bien la mémoire physique tombé a 0 en Libre et Disponible et le cache presque à 0 également. Windows est juste à deux doit de la syncope mais aucun problème hors de l'IDE.

    Je précise que j'ai ce problème même en enlevant les informations de débogages.

    Enfin bref, je ne sais comment résoudre ce genre de problème sans diminué les allocations faites, ce qui ne serait pas très logique pour une phase de test dans l'IDE.

    Je clos, mais n'hésitez pas si vous avez des pistes.

    Merci encore white_tentacle
    Homer J. Simpson


  5. #5
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Citation Envoyé par Astraya Voir le message
    Un allocateur mémoire est « généraliste », oui, le lineaire non! Nullifier la mémoire reviendrait à ralentir l'allocation sans rien apporter.
    Juste sur ce point, si : nullifier la mémoire apporte de la sécurité, au prix de la lenteur. En gros, cela garantit qu’un processus ne peut pas accéder à la mémoire d’un autre processus, même en allouant toute la mémoire disponible et en analysant les zones de mémoire que lui renvoient l’allocateur (en allouant beaucoup de mémoire, tu peux forcer la machine à copier dans le swap les process les moins actifs, et aller ensuite gentiment farfouiller dans la mémoire qui vient de t’être donnée, non nettoyée, pour récupérer d’éventuelles choses intéressantes).

  6. #6
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    Ok je vois le rapport. Dans mon cas, je ne cherche pas la sécurité à tout prix, je ne transporte pas de numéro de carte bleu, mais je cherche la rapidité à tout prix. Au quel cas, un calloc remplacera le malloc à l'allocation et le memset pour la destruction. C'est bon a savoir

    Merci
    Homer J. Simpson


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

Discussions similaires

  1. pourquoi mon virtualdevice est lent sur un pc rapide ?
    Par clavier12AZQSWX dans le forum Android
    Réponses: 8
    Dernier message: 15/06/2012, 18h47
  2. [DEV] Mon programme en C est lent sur Mac G4, pourquoi ? Que faire ?
    Par mator dans le forum Développement OS X
    Réponses: 3
    Dernier message: 10/10/2007, 00h08
  3. Pourquoi VB .NET est lent ?
    Par Aizen64 dans le forum Général Dotnet
    Réponses: 5
    Dernier message: 25/07/2007, 12h26
  4. Faire apparaître un menu est lent sur IE6
    Par SlashOwnsU dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 20/09/2006, 17h12
  5. Pourquoi cette requête est lente ?
    Par zenzo dans le forum Langage SQL
    Réponses: 7
    Dernier message: 06/01/2006, 15h15

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