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++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre �clair�
    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
    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
    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
    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.

  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 confirm�

    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
    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

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