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 :

performance du new


Sujet :

C++

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 396
    Points : 230
    Points
    230
    Par défaut performance du new
    Bonjour,


    J'ai une boucle qui tourne à l'infini et dans cette boucle, je construis une enveloppe convexe à partir de quelques points.
    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while(true) {
      //.......
      delete convexHull;
      convexHull = new ConvexHull(points);
    //.........
    }
    Est-ce que le delete+new est quelque chose de lent ou d'assez rapide ?
    Faut-il préférer un delete+new de 16 octets ou un clear de deux std::list<int> d'une dizaine d'éléments par exemple ?

    Je me doute bien que le new et le delete dépende un peu de l'OS mais j'aimerais avoir quand même une petite idée la dessus.

    Et tant que je suis, quel est la différence de rapidité entre les 2 lignes:
    Merci d'avance...

  2. #2
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Est-ce que le delete+new est quelque chose de lent ou d'assez rapide ?
    Lent. Déjà ça dépends de l'implémentation fournie par le compilateur, souvent fait pour gérer les "cas généraux". Ensuite il y a le fait qu'il y a pas mal de vérifications effectuées, et que l'OS aussi doit effectuer l'allocation.

    Si ça pose un problème, il y a plusieurs solutions qui permettent d'accélérer le tout. Globalement elles reviennent toutes à éviter totallement toute allocation/désallocation de mémoire pendant le traitement des données. (voir placement new, std::vector::reserve(), boost::pool ...)

    Souvent dans le développement de jeux vidéos (pour d'autres raisons aussi) on alloue dés le départ des pool de mémoire qui sont donc réservés du point de vue de l'OS, et qu'on peut ensuite utiliser pour créer des objets via des placement new, souvent avec un peu de sucre syntactique histoire de faciliter l'ecriture.

    Dans les cas simples, réserver la mémoire nécessaire avant l'utilisation, comme reserver la mémoire d'un vector avant de l'utiliser, est largement suffisant.

  3. #3
    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
    Citation Envoyé par zenux Voir le message
    Et tant que je suis, quel est la différence de rapidité entre les 2 lignes:
    Merci d'avance...
    Si tu poses cette question, c'est qu'il te manque les notions de base de C++.
    La première version met la variable sur la pile, ce qui est extrémement rapide et permet aussi une gestion mémoire automatique (l'objet meurt lorsqu'il sort de la portée).
    La deuxième version alloue dynamiquement un objet dans une zone libre. C'est assez coûteux et il te faudra toi-même libérer cette mémoire. Il est très fortement conseillé d'utiliser l'idiome RAII pour gérer cette mémoire de manière automatique, d'une manière en fait similaire à une variable sur la pile.
    Boost ftw

  4. #4
    screetch
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    while(true) {
      //.......
      delete convexHull;
      convexHull = new ConvexHull(points);
    //.........
    }
    c'est presque gratuit (presque...) avec la plupart des malloc, qui vont reutiliser le meme bloc. mais c'est tres tres deconseille car une variable locale semble bien plus indiquée ici.

  5. #5
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Je ne vais pas répeter ce qui a été dit précédemment et qui est tout à fait pertinent... Dans l'exemple sus-cité, une variable locale semble bien plus appropriée...

    Néanmoins, j'aimerai apporté quelques nuances:

    Citation Envoyé par zenux Voir le message
    Est-ce que le delete+new est quelque chose de lent ou d'assez rapide ?
    Le "new" du C++ est *tres* versatile... C'est un shortcut de language sur: une allocation (operator new(size_t)) et un appel au constructeur de l'objet (placed new).
    Le premier peut être surchargé par unité de compilation, classe, namespace... Il est donc assez difficile de donner une réponse quant à sa rapidité...
    L'implémentation par défaut est un appel à "malloc", qui peut être assez lent, en particulier dans un contexte multi-threadé.

    Le "delete" du C++ est le pendant exact du new, à savoir: un appel au destructeur de l'objet, puis une désallocation (operator delete(void*)) de la mémoire. Et ce dernier est obligatoirement symétrique avec le new... donc... par défaut... un appel à "free", qui va lui aussi être lent en contexte multi-threadé.

    Va faire:
    - Déplacer le pointeur de pile du thread en cours de sizeof(A) (le plus souvent une seule fois, quand nécessaire, pour toutes les variables 'utiles').
    - Appeler le constructeur par défaut de A sur la partie ainsi "allouée".
    ...
    - Appeler le destructeur de A
    - Déplacer le pointeur de pile du thread en cours en arriere (d'ailleurs le plus souvent en une seule fois, à la sortie de la fonction, pour toutes les variables).

    Ainsi...
    Va faire 1 seul déplacement de pile et deux appels constructeurs...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    A *a = new A();
    delete a;
    Va faire:
    - Allocation de sizeof(A) octets. Soit:
    - - Semaphore-Lock
    - - Recherche zone mémoire capable de contenir sizeof(A)
    - - Reservation de la mémoire.
    - - Semaphore-Unlock
    - Appel du constructeur de A
    ...
    - Appel du destructeur de A
    - Libération de la zone... soit:
    - - Semaphore-Lock
    - - Libération de la mémoire... avec éventuellement, aggrégation des zones libres.
    - - Semaphore-Unlock
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

Discussions similaires

  1. [ POSTGRESQL ] Problème de performance
    Par Djouls64 dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 26/05/2003, 16h18
  2. [JDBC][connexion persistante] performances avec JDBC
    Par nawac dans le forum Connexion aux bases de données
    Réponses: 6
    Dernier message: 06/05/2003, 10h37
  3. performance entre 3DS, ase, asc ...
    Par amaury pouly dans le forum OpenGL
    Réponses: 3
    Dernier message: 24/03/2003, 11h41
  4. Bug new build ??
    Par rgarnier dans le forum XMLRAD
    Réponses: 4
    Dernier message: 31/01/2003, 10h30
  5. [] Insérer DE et Datareport existant ds new projet
    Par khany dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 10/01/2003, 09h52

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