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 :

difference entre clear() et swap()


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut difference entre clear() et swap()
    Bonjour,

    lorsque j'ai un conteneur (vector, set, map...), et que je veux le vider, j'ai pris l'habitude de faire un swap:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    vector<int> mon_vecteur;
     
    //... je remplis mon vecteur
     
    vector<int>().swap( mon_vecteur ); // je vide le vecteur
    Mais j'ai un doute soudain: quelle est la différence entre le swap ci-dessus et la fonction membre clear()?

    ps: la seule "doc" aue j'arrive à trouver sur clear() est: "erase all the elements".

    ps2: en fait, ce doute m'est venu parce que je dois optimiser un code et là je cherche à optimiser la moindre ligne.

  2. #2
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Erase/remove trick pour enlever d'un conteneur.

    swap trick pour libérer la mémoire. (ie le conteneur reste en mémoire en fait au cas où tu le reconstruises après.)

    swap trick :
    vector<int>(foo).swap(foo).

  3. #3
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Je dirais que clear() ne libère pas la mémoire allouée alors que ton swap() va réinitialiser l'espace réservé à la valeur initiale.
    Essaye de faire un capacity() après un clear()/swap( std::vector<...>() ) sur un vecteur avec pas mal d'éléments pour voir la différence ?

    MAT.

  4. #4
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Ouai enfin, j'ai dis erase remove, mais bon, pour le vider tu fais un clear. Sa libère les objets mais pas la mémoire associé au vecteur lui même, (optimisation apparemment).
    Pour la libérer vraiment t'as le swap trick.


    (avec les déboires du server je me suis trompé dans ce que j'ai posté ^^).

  5. #5
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Salut,
    La différence c'est que clear() ne désalloue pas la mémoire. Par exemple pour un vecteur, un clear est très rapide, il détruit les objets et set le pointeur de taille au début du tableau. (size = 0, capacité = inchangé)

    L'équivalent C++0x du swap trick serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    v.clear();
    v.shrink_to_fit() // ajuste la capacité, donc ici désalloue entièrement.

  6. #6
    Membre chevronné
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Par défaut
    Chez moi, la différence (en terme de perf) est nulle.

  7. #7
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Mat007 Voir le message
    Salut,

    Je dirais que clear() ne libère pas la mémoire allouée alors que ton swap() va réinitialiser l'espace réservé à la valeur initiale.
    Essaye de faire un capacity() après un clear()/swap( std::vector<...>() ) sur un vecteur avec pas mal d'éléments pour voir la différence ?

    MAT.
    Oui c'est bien ça, tu as raison.

    Citation Envoyé par JulienDuSud Voir le message
    Chez moi, la différence (en terme de perf) est nulle.
    Chez moi il y a de grosses différences, tant en debug qu'en release. Teste avec le code suivant par ex.:

    Code cplusplus : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <string>
    #include <ostream>
     
    #include "windows.h" // oué bon je sais... (mais j'ai pas boost d'installé là et je suis pressé :p )
     
    using namespace std;
     
    class PerfTimer
    {
    public:
    	PerfTimer();
    	~PerfTimer();
     
    	static bool Init()
    	{
    		LARGE_INTEGER proc_freq;
     
    		if ( !QueryPerformanceFrequency( &proc_freq ) ) 
    			return false;
     
    		frequency = 1.0 / proc_freq.QuadPart;
    		return true;
    	}
     
    	void	Start() { QueryPerformanceCounter( &start ); }
     
    	double	Stop()
    	{
    		QueryPerformanceCounter( &stop );
    		return ( ( stop.QuadPart - start.QuadPart ) * frequency );
    	}
     
    	void	StopAndPrint( const std::string & message, std::ostream & ostr );
    	{
    		double duracion = Stop();
    		ostr << message << duracion << " ms" << std::endl;
    	}
     
    private:
    	static double	frequency;
    	LARGE_INTEGER	start;
    	LARGE_INTEGER	stop;
    };
     
    double PerfTimer::frequency = 0;
     
    struct MyGenerate
    {
    	MyGenerate():counter(0){}
    	int operator () () { return counter++; }
    private:
    	int counter;
    };
     
    int main()
    {
    	if ( !PerfTimer::Init() )
    	{
    		cout << "error: problema en la inicializacion de PerfTimer" << endl;
    		return EXIT_FAILURE;
    	}
     
    	PerfTimer pt;
    	vector<int> v( 500000 );
     
    	pt.Start();
    	generate( v.begin(), v.end(), MyGenerate() );
    	pt.StopAndPrint( "generate: ", cout );
     
    	pt.Start();
    	v.clear();
    	pt.StopAndPrint( "clear: ", cout );
     
    	cout << "cap: " << v.capacity() << endl;
     
    	vector<int> v1( 500000 );
    	generate( v1.begin(), v1.end(), MyGenerate() );
     
    	pt.Start();
    	vector<int>().swap( v1 );
    	pt.StopAndPrint( "swap: ", cout );
     
    	cout << "cap: " << v1.capacity() << endl;
     
    	cout << "end" << endl;
    	cin.get();
    	return EXIT_SUCCESS;
    }

  8. #8
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Non mais les perfs à gagné sont au niveau de l'occupation mémoire. Pas au niveau de la rapidité. Le swap trick met à 0 la capacity du vector, c'est comme ça que tu gagnes de la place.

  9. #9
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par Goten Voir le message
    Le swap trick met à 0 la capacity du vector, c'est comme ça que tu gagnes de la place.

    Je pensais qu'il inversait (en gros) les buffers ce qui fait que mon_vecteur a un buffer vide et que le vecteur temporaire non nommé libère l'ancien buffer. La différence de temps doit être dans le delete[] globalement non ?

  10. #10
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Ben il swap aussi la capacity, la capacity du temporaire étant à 0...

    Et c'est ça le plus important la capacity. (c'est ça qui prend de la place en mémoire).

  11. #11
    Membre chevronné
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Par défaut
    Citation Envoyé par r0d Voir le message
    Chez moi il y a de grosses différences, tant en debug qu'en release.
    Alors vu que je suis pas sous windows, ce code, chez moi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <string>
    #include <ostream>
     
    #include <time.h>
     
    struct PerfTimer {
    	struct GetTimeFailure{};
     
    	timespec start;
     
    	PerfTimer()
    	{
    		restart();
    	}
     
    	void restart() 
    	{
    		start = getTime();
    	}
     
    	double elapsed()
    	{
    		timespec now = getTime();
    		return (now.tv_nsec - start.tv_nsec) / 1000000.0; // nano to ms
    	}
     
    	timespec getTime()
    	{
    		timespec ret;
    		if( clock_gettime( CLOCK_REALTIME, &ret ) == -1 )
    			throw GetTimeFailure();
    		return ret;
    	}
    };
     
    struct MyGenerate
    {
    	MyGenerate():counter(0){}
    	int operator () () { return counter++; }
    private:
    	int counter;
    };
     
    using namespace std;
     
    int main()
    {
    	PerfTimer t;
     
    	double sum = 0;
     
    	vector<int> v(5000000);
     
    	for( int i = 0; i < 1000000; ++i )
    	{
    		generate( v.begin(), v.end(), MyGenerate() );
    		t.restart();
    		v.clear();
    		sum += t.elapsed();
     
    	}
     
    	cout << "clear within " << sum << "ms." << endl;
     
    	sum = 0;
     
    	for( int i = 0; i < 1000000; ++i )
    	{
    		generate( v.begin(), v.end(), MyGenerate() );
    		t.restart();
    		vector<int>().swap( v );
    		sum += t.elapsed();
    	}
     
    	cout << "swap within " << sum << "ms." << endl;
     
    	cin.get();
    	return EXIT_SUCCESS;
    }
    donne
    clear within 55.044ms.
    swap within 56.4456ms.
    Avec -O3, bien sûr.

    edit: je viens de lancer 1000 tests d'affilés (dans le code, pas en externe), et j'obtiens ça:

    clear averages 19.3602ms.
    swap averages 19.407ms.
    Donc c'est vraiment pareil au niveau du temps mis "par instruction". Par contre, l'un libère la mémoire l'autre pas. Tout dépend de ce que tu veux faire, donc. Si tu comptes réinsérer des éléments par la suite, clear() est mieux. Si t'as besoin d'espace tout de suite (gros gros vector sur une petite machine), swap est le mieux.

    Je rejoins donc goten.

  12. #12
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Comme je l'ai dit. Le but du swap trick est de sauver de la mémoire pas du temps processus.

  13. #13
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Il y a tout de même quelque chose de bizzarre dans cette histoire, parce que j'ai testé le code que j'ai posté ci-dessus sur plusieurs machines, et à chaque fois j'obtiens des résultats fort différents... là par exemple, j'ai:
    generate: 0.107798 ms
    clear: 1.10955e-006 ms
    cap: 50000000
    generate 2: 0.107292 ms
    swap: 0.0103587 ms
    cap: 0
    end
    Ce qui signifie que le clear() est environ 10000 fois plus rapide que le swap
    des fois c'est l'inverse... et des fois c'est pareil

    comprends pô

  14. #14
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par JulienDuSud Voir le message
    Alors vu que je suis pas sous windows, ce code, chez moi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <string>
    #include <ostream>
     
    #include <time.h>
     
    struct PerfTimer {
    	struct GetTimeFailure{};
     
    	timespec start;
     
    	PerfTimer()
    	{
    		restart();
    	}
     
    	void restart() 
    	{
    		start = getTime();
    	}
     
    	double elapsed()
    	{
    		timespec now = getTime();
    		return (now.tv_nsec - start.tv_nsec) / 1000000.0; // nano to ms
    	}
     
    	timespec getTime()
    	{
    		timespec ret;
    		if( clock_gettime( CLOCK_REALTIME, &ret ) == -1 )
    			throw GetTimeFailure();
    		return ret;
    	}
    };
     
    struct MyGenerate
    {
    	MyGenerate():counter(0){}
    	int operator () () { return counter++; }
    private:
    	int counter;
    };
     
    using namespace std;
     
    int main()
    {
    	PerfTimer t;
     
    	double sum = 0;
     
    	vector<int> v(5000000);
     
    	for( int i = 0; i < 1000000; ++i )
    	{
    		generate( v.begin(), v.end(), MyGenerate() );
    		t.restart();
    		v.clear();
    		sum += t.elapsed();
     
    	}
     
    	cout << "clear within " << sum << "ms." << endl;
     
    	sum = 0;
     
    	for( int i = 0; i < 1000000; ++i )
    	{
    		generate( v.begin(), v.end(), MyGenerate() );
    		t.restart();
    		vector<int>().swap( v );
    		sum += t.elapsed();
    	}
     
    	cout << "swap within " << sum << "ms." << endl;
     
    	cin.get();
    	return EXIT_SUCCESS;
    }
    donne


    Avec -O3, bien sûr.

    edit: je viens de lancer 1000 tests d'affilés (dans le code, pas en externe), et j'obtiens ça:



    Donc c'est vraiment pareil au niveau du temps mis "par instruction". Par contre, l'un libère la mémoire l'autre pas. Tout dépend de ce que tu veux faire, donc. Si tu comptes réinsérer des éléments par la suite, clear() est mieux. Si t'as besoin d'espace tout de suite (gros gros vector sur une petite machine), swap est le mieux.

    Je rejoins donc goten.
    Je ne souhaite pas me montrer excessivement cruel, mais ton code ne fait pas grand chose, étant donné que

    1) le vecteur est créé en dehors de toute boucle, ce qui fait que après le second clear ne change pas l'état du vecteur : puis v.begin() == v.end().

    2) idem, ce qui fait qu'une fois le premier swap effectué, le vecteur est cette fois complètement vide : v.begin() == v.end() = NULL ; donc aucune deallocation n'aura lieu après.

    C'est donc assez normal que tu ait les même resultats.

    Je rajoute les lignes v.resize() qui vont bien, le code devient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <string>
    #include <ostream>
     
    #include <time.h>
     
    struct PerfTimer {
    	struct GetTimeFailure{};
     
    	timespec start;
     
    	PerfTimer()
    	{
    		restart();
    	}
     
    	void restart() 
    	{
    		start = getTime();
    	}
     
    	double elapsed()
    	{
    		timespec now = getTime();
    		return (now.tv_nsec - start.tv_nsec) / 1000000.0; // nano to ms
    	}
     
    	timespec getTime()
    	{
    		timespec ret;
    		if( clock_gettime( CLOCK_REALTIME, &ret ) == -1 )
    			throw GetTimeFailure();
    		return ret;
    	}
    };
     
    struct MyGenerate
    {
    	MyGenerate():counter(0){}
    	int operator () () { return counter++; }
    private:
    	int counter;
    };
     
    using namespace std;
     
    int main()
    {
    	PerfTimer t;
     
    	double sum = 0;
     
    	// bloc, histoire de contrôler la destruction de v	
        {
    		vector<int> v;
     
    		for( int i = 0; i < 100000; ++i )
    		{
    			v.resize(10000);
    			generate( v.begin(), v.end(), MyGenerate() );
    			t.restart();
    			v.clear();
    			sum += t.elapsed();
    		}
    	}
     
    	cout << "clear within " << sum << "ms." << endl;
     
    	sum = 0;
     
        // bloc, histoire de contrôler la destruction de v	
        {
    		vector<int> v;
     
        	for( int i = 0; i < 100000; ++i )
        	{
        		v.resize(10000);
        		generate( v.begin(), v.end(), MyGenerate() );
        		t.restart();
        		vector<int>().swap( v );
        		sum += t.elapsed();
        	}
    	}
    	cout << "swap within " << sum << "ms." << endl;
    }
    La ligne de commande :

    $> g++ -O3 -o swaptrick swaptrick.cpp -lrt

    Le résultat :

    clear within 196.558ms.
    swap within 205.515ms.

    Il y a clairement une différence, mais vu le nombre d'itérations, ça n'est pas vraiment clairement significatif. A noter que dans le premier cas, le v.resize() n'est pas censé avoir d'effet, puisque la capacité ne change pas. Dans le second cas, v.resize() a besoin de faire une allocation, ce qui peut être une perte de temps supplémentaire dans certains contextes...
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  15. #15
    Membre chevronné
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Par défaut
    Citation Envoyé par Emmanuel Deloget Voir le message
    Je ne souhaite pas me montrer excessivement cruel, mais ton code ne fait pas grand chose, étant donné que

    1) le vecteur est créé en dehors de toute boucle, ce qui fait que après le second clear ne change pas l'état du vecteur : puis v.begin() == v.end().

    2) idem, ce qui fait qu'une fois le premier swap effectué, le vecteur est cette fois complètement vide : v.begin() == v.end() = NULL ; donc aucune deallocation n'aura lieu après.

    C'est donc assez normal que tu ait les même resultats.
    Oui, tu as raison .

    A noter que dans le premier cas, le v.resize() n'est pas censé avoir d'effet, puisque la capacité ne change pas. Dans le second cas, v.resize() a besoin de faire une allocation, ce qui peut être une perte de temps supplémentaire dans certains contextes...
    dans ce cas-ci, ça ne devrait pas influencer sur les mesures vu qu'on mesure pas le temps d'allocation, juste le temps qu'il faut pour vider.

    Mes valeures sont plutôt fixes:

    clear within 4.2654ms.
    swap within 7.72939ms.
    La différence de vitesse c'est celle de la désallocation, prenons ce code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <string>
    #include <ostream>
     
    #include <time.h>
     
    struct PerfTimer {
    	struct GetTimeFailure{};
     
    	timespec start;
     
    	PerfTimer()
    	{
    		restart();
    	}
     
    	void restart() 
    	{
    		start = getTime();
    	}
     
    	double elapsed()
    	{
    		timespec now = getTime();
    		return (now.tv_nsec - start.tv_nsec) / 1000000.0; // nano to ms
    	}
     
    	timespec getTime()
    	{
    		timespec ret;
    		if( clock_gettime( CLOCK_REALTIME, &ret ) == -1 )
    			throw GetTimeFailure();
    		return ret;
    	}
    };
     
    struct A {
    	~A() {
    		std::cout << "destruction" << std::endl;
    	}
    };
     
    struct MyGenerate
    {
    	MyGenerate(){}
    	A operator () () { return A(); }
    private:
    	//int counter;
    };
     
    using namespace std;
     
    int main()
    {
    	PerfTimer t;
     
    	double sum = 0;
     
    	sum = 0;
     
    	// bloc, histoire de contrôler la destruction de v	
        {
    		for( int i = 0; i < 10; ++i ) {
    			vector<A> v;
    			v.resize(5);
    			generate( v.begin(), v.end(), MyGenerate() );
    			t.restart();
    			cout << "hi" << endl;
    			vector<A>().swap( v );
    			cout << "ha" << endl;
    			sum += t.elapsed();
    		}
    	}
     
    	cout << "swap within " << sum << "ms." << endl;
     
    }
    Il y a désallocation entre t.restart() et t.elapsed(), donc c'est normal qu'il y ait une différence de temps (clear ne désalloue pas).

Discussions similaires

  1. Différences entre Delphi et Visual Basic ?
    Par Anonymous dans le forum Débats sur le développement - Le Best Of
    Réponses: 75
    Dernier message: 30/03/2009, 20h09
  2. La difference entre XSL et XSLT?
    Par pantin dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 27/06/2003, 15h14
  3. Difference entre fenetre et boite de dialog
    Par billyboy dans le forum Windows
    Réponses: 2
    Dernier message: 02/06/2003, 15h43
  4. [] Difference entre MSHFlexGrid et MSFlexGrid
    Par olivierx dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 23/04/2003, 08h48
  5. Difference entre types d'Adresse IP
    Par freud dans le forum Développement
    Réponses: 3
    Dernier message: 02/03/2003, 02h06

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