begin process at 2012 05 27 17:43:19
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Divers

 > PERFORMANCE DE DIFFÉRENTS CONTAINERS DE LA STL

PERFORMANCE DE DIFFÉRENTS CONTAINERS DE LA STL


 Information sur la source

 Description

Programme montrant les différences de performances entre certains containers
de la stl
Les containers testés sont les suivants :
- std::vector
- std::list
- std::stack
- std::queue
Pour l'instant, seulement les fonctions suivantes sont testés :
- Ajout d'un élément en fin
- Suppression d'un élément en fin

Protocole de test :
- Appel de la fonction NB_ITERATION fois

Informations :
- NB_ITERATION doit être assez grand (dépend de la puissance de la machine)
  pour que les valeurs soient significatives

Améliorations :
- Tester plus de containers et plus de fonctions
                                                                                                                                                                                

Source

  • /**
  • * Programme montrant les différences de performances entre certains containers
  • * de la stl
  • * Les containers testés sont les suivants :
  • * - std::vector
  • * - std::list
  • * - std::stack
  • * - std::queue
  • * Pour l'instant, seulement les fonctions suivantes sont testés :
  • * - Ajout d'un élément en fin
  • * - Suppression d'un élément en fin
  • *
  • * Protocole de test :
  • * - Appel de la fonction NB_ITERATION fois
  • *
  • * Informations :
  • * - NB_ITERATION doit être assez grand (dépend de la puissance de la machine)
  • * pour que les valeurs soient significatives
  • *
  • * Améliorations :
  • * - Tester plus de containers et plus de fonctions
  • */
  • #include <vector>
  • #include <list>
  • #include <iostream>
  • #include <queue>
  • #include <time.h>
  • #include <typeinfo>
  • #include <stack>
  • using namespace std;
  • static clock_t start, finish;
  • static double duration;
  • static int NB_ITERATION = 0;
  • /**
  • * Appel de la fonction NB_ITERATION fois
  • */
  • double getFunctionDuration(void (*pt2Function)(void* pt2Object, int parameter), void * object) {
  • start = clock();
  • for (int i = 0; i < NB_ITERATION; i++)
  • (*pt2Function)(object, i);
  • finish = clock();
  • return (double)(finish - start) / CLOCKS_PER_SEC;
  • }
  • template <class T>
  • static void wrapper_for_push_back(void * container, int parameter)
  • {
  • T * casted_container = (T*) container;
  • casted_container->push_back(parameter);
  • }
  • template <typename T>
  • static void wrapper_for_push(void * container, int parameter)
  • {
  • T * casted_container = (T*) container;
  • casted_container->push(parameter);
  • }
  • template <typename T>
  • static void wrapper_for_pop_back(void * container, int parameter)
  • {
  • T * casted_container = (T*) container;
  • casted_container->pop_back();
  • }
  • template <typename T>
  • static void wrapper_for_pop(void * container, int parameter)
  • {
  • T * casted_container = (T*) container;
  • casted_container->pop();
  • }
  • int main() {
  • cout << " Iteration times = ";
  • cin >> NB_ITERATION;
  • std::vector<int> v;
  • std::list<int> l;
  • std::queue<int> q;
  • std::stack<int> s;
  • // Tests des insertions en fin
  • cout << "push_back vector = " << getFunctionDuration(wrapper_for_push_back<std::vector<int>>, &v) << endl;
  • cout << "push_back list = " << getFunctionDuration(wrapper_for_push_back<std::list<int>>, &l) << endl;
  • cout << "push queue = " << getFunctionDuration(wrapper_for_push<std::queue<int>>, &q) << endl;
  • cout << "push stack = " << getFunctionDuration(wrapper_for_push<std::stack<int>>, &s) << endl;
  • // Tests des suppression en fin
  • cout << "pop_back vector = " << getFunctionDuration(wrapper_for_pop_back<std::vector<int>>, &v) << endl;
  • cout << "pop_back list = " << getFunctionDuration(wrapper_for_pop_back<std::list<int>>, &l) << endl;
  • cout << "pop queue = " << getFunctionDuration(wrapper_for_pop<std::queue<int>>, &q) << endl;
  • cout << "pop stack = " << getFunctionDuration(wrapper_for_pop<std::stack<int>>, &s) << endl;
  • cin.get();
  • }
/**
* Programme montrant les différences de performances entre certains containers
* de la stl
* Les containers testés sont les suivants :
* - std::vector
* - std::list
* - std::stack
* - std::queue
* Pour l'instant, seulement les fonctions suivantes sont testés :
* - Ajout d'un élément en fin
* - Suppression d'un élément en fin
*
* Protocole de test :
* - Appel de la fonction NB_ITERATION fois
*
* Informations :
* - NB_ITERATION doit être assez grand (dépend de la puissance de la machine) 
*   pour que les valeurs soient significatives
* 
* Améliorations :
* - Tester plus de containers et plus de fonctions
*/

#include <vector>
#include <list>
#include <iostream>
#include <queue>
#include <time.h>
#include <typeinfo>
#include <stack>

using namespace std;

static clock_t start, finish; 
static double duration;
static int NB_ITERATION = 0;

/**
* Appel de la fonction NB_ITERATION fois
*/
double getFunctionDuration(void (*pt2Function)(void* pt2Object, int parameter), void * object) {
	start = clock();
	for (int i = 0; i < NB_ITERATION; i++)
		(*pt2Function)(object, i);
	finish = clock();
	return (double)(finish - start) / CLOCKS_PER_SEC;
}

template <class T>
static void wrapper_for_push_back(void * container, int parameter)
{
	T * casted_container = (T*) container;
	casted_container->push_back(parameter);
}

template <typename T>
static void wrapper_for_push(void * container, int parameter)
{
	T * casted_container = (T*) container;
	casted_container->push(parameter);
}

template <typename T>
static void wrapper_for_pop_back(void * container, int parameter)
{
	T * casted_container = (T*) container;
	casted_container->pop_back();
}

template <typename T>
static void wrapper_for_pop(void * container, int parameter)
{
	T * casted_container = (T*) container;
	casted_container->pop();
}

int main() {

	cout << " Iteration times = ";
	cin >> NB_ITERATION;
	
	std::vector<int> v;
	std::list<int> l;
	std::queue<int> q;
	std::stack<int> s;
	
	// Tests des insertions en fin
	cout << "push_back vector = " << getFunctionDuration(wrapper_for_push_back<std::vector<int>>, &v) << endl;
	cout << "push_back list = "   << getFunctionDuration(wrapper_for_push_back<std::list<int>>, &l) << endl;
	cout << "push queue = "       << getFunctionDuration(wrapper_for_push<std::queue<int>>, &q) << endl;
	cout << "push stack = "       << getFunctionDuration(wrapper_for_push<std::stack<int>>, &s) << endl;

	// Tests des suppression en fin
	cout << "pop_back vector = "  << getFunctionDuration(wrapper_for_pop_back<std::vector<int>>, &v) << endl;
	cout << "pop_back list = "    << getFunctionDuration(wrapper_for_pop_back<std::list<int>>, &l) << endl;
	cout << "pop queue = "        << getFunctionDuration(wrapper_for_pop<std::queue<int>>, &q) << endl;
	cout << "pop stack = "        << getFunctionDuration(wrapper_for_pop<std::stack<int>>, &s) << endl;
	
	cin.get();
}



 Sources de la même categorie

Source avec Zip KISIEL CD INFO DRIVE par kisiel0147852
Source avec une capture SUPPRESSION DES REDONDANCES DE FICHIERS par cyberntique
Source avec Zip ÉDITEUR DE RECTANGLES EN CONSOLE par seoseo
CONVERSION DE FICHIER EN FICHIER BMP par seoseo
Source avec Zip DETECTEUR EJP par idpro

 Sources en rapport avec celle ci

Source avec Zip CALLOCATOR par troctsch
Source avec une capture MAP STL ET ARBRES ROUGES ET NOIRS par guill76
Source avec une capture CALCUL DE L'ENVELOPPE CONVEXE D'UN NUAGE DE POINTS DANS UN P... par Lucky92
COMPARAISON DES PERFORMANCE D'ALGORITHMES POUR OPTIMISER UN ... par fuliculi
IMPLEMENTATION STL (LIST) par Taron31

Commentaires et avis

Commentaire de CptPingu le 11/03/2011 19:41:53 administrateur CS

- Évite les "using namespace", voir: [url=http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace]http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace[/url]
- Évite les void*, ça n'a rien à faire en C++. Tu peux les éviter avec de l'héritage ou des templates.
- Évite les variables globales
- En C++, on utilise un namespace anonyme et non plus le mot clé "static".
- clock n'est pas très précis

Je te propose une version pure C++:

#ifndef SCOPEELAPSEDTIME_HH_
# define SCOPEELAPSEDTIME_HH_

# include <iostream>
# include <sstream>
# include <ctime>
# include <sys/time.h>

class ScopeElapsedTime
{
public:
  ScopeElapsedTime()
    : origin_("")
  {
    gettimeofday(&begin_, &tz_);
  }

  ScopeElapsedTime(const std::string& origin)
    : origin_(origin)
  {
    gettimeofday(&begin_, &tz_);
  }

  ~ScopeElapsedTime()
  {
    std::ostringstream buff;
    gettimeofday(&end_, &tz_);
    long time = (end_.tv_sec - begin_.tv_sec) *
      1000000L + (end_.tv_usec - begin_.tv_usec);
    if (!origin_.empty())
      buff << "[" << origin_ << "]";
    buff << "Elapsed time: " << time << " us";

    std::cout << buff.str() << std::endl;
  }

private:
  std::string origin_;
  struct timeval begin_, end_;
  struct timezone tz_;
};

#endif /* !SCOPEELAPSEDTIME_HH_ */

#include <iostream>
#include <vector>
#include <list>
#include <queue>
#include <stack>

namespace
{
  template <typename Container, typename Type>
  struct Func
  {
    typedef void (*pFunc) (Container& container, const Type& parameter);
  };

  template <typename Container, typename Type>
  void push(Container& container, const Type& parameter)
  {
    container.push_back(parameter);
  }

  template <typename Type>
  void push(std::queue<Type>& container, const Type& parameter)
  {
    container.push(parameter);
  }

  template <typename Type>
  void push(std::stack<Type>& container, const Type& parameter)
  {
    container.push(parameter);
  }

  template <typename Container, typename Type>
  void pop(Container& container, const Type&)
  {
    container.pop_back();
  }

  template <typename Type>
  void pop(std::queue<Type>& container, const Type&)
  {
    container.pop();
  }

  template <typename Type>
  void pop(std::stack<Type>& container, const Type&)
  {
    container.pop();
  }

  template <typename Container, typename Type>
  void wrapperShowFunctionDuration(Container& v, const Type& t, int nb_iteration,
   const std::string& name, typename Func<Container, Type>::pFunc func)
  {
    ScopeElapsedTime timer(name);
    for (int i = 0; i < nb_iteration; ++i)
      func(v, t);
  }

  template <typename Container, typename Type>
  void showFunctionDuration(Container& v, int nb_iteration, const std::string& name, typename Func<Container, Type>::pFunc func)
  {
    const Type t = Type();
    wrapperShowFunctionDuration(v, t, nb_iteration, name, func);
  }
}

int main()
{
  ScopeElapsedTime timer("Global");
  int nb_iteration = 0;
  std::cout << " Iteration times = ";
  std::cin >> nb_iteration;

  std::vector<int> v;
  std::list<int> l;
  std::queue<int> q;
  std::stack<int> s;

  showFunctionDuration<std::vector<int>, int>(v, nb_iteration, "Push Vector", push<std::vector<int>, int>);
  showFunctionDuration<std::list<int>, int>(l, nb_iteration, "Push List", push<std::list<int>, int>);
  showFunctionDuration<std::queue<int>, int>(q, nb_iteration, "Push Queue", push<int>);
  showFunctionDuration<std::stack<int>, int>(s, nb_iteration, "Push Stack", push<int>);

  showFunctionDuration<std::vector<int>, int>(v, nb_iteration, "Pop Vector", pop<std::vector<int>, int>);
  showFunctionDuration<std::list<int>, int>(l, nb_iteration, "Pop List", pop<std::list<int>, int>);
  showFunctionDuration<std::queue<int>, int>(q, nb_iteration, "Pop Queue", pop<int>);
  showFunctionDuration<std::stack<int>, int>(s, nb_iteration, "Pop Stack", pop<int>);

  return 0;
}

Commentaire de shenron666 le 13/03/2011 20:10:25

Bon code de débutant (avec les erreurs qui vont avec).
Suis les conseils de CptPingu, plus tôt tu évites les mauvaises pratiques, mieux ce sera par la suite

Commentaire de TeddyBear94 le 14/03/2011 10:57:57

Effectivement je vois que j'ai encore des progrès à faire...
Pour ce qui est du using namespace std, je pensais que les erreurs qui pouvaient en découler était marginales, mais en lisant l'article, pas tant que ça en fait...
Pour les variables globales et l'usage de static, c'est un oubli de ma part, je voulais les enlever, mais merci pour l'info du namespace anonyme.
Sinon merci beaucoup pour la correction.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

STL [ par romualdp ] Ou puis-je trouver la documentation complete de la STL??? Liste chainée en C++ sans STL (ni vector ni template) [ par Tamahome ] Bonjour,je cherche un exemple de liste chainée (sans STL: ni vector ni template) enC++ (pas en C) permettant de chainer des objets héterogenes (par ex attribut de classe de la STL [ par MLine ] Slut,je définis un attribut de classe :static vector&lt;vector&lt;Organism*&gt; &gt; vectorg;qui est donc un tableau de pointeurs sur des instances de STL : fonction size [ par UbuRoi ] cout&lt;&lt;UnitStack.size()&lt;&lt;endl;warning C4267: 'argument' : conversion from 'size_t' to 'unsigned int', possible loss of dataPourquoi diable STL : Afficher le contenu d'un stack [ par UbuRoi ] J'ai essayé comme ça :vector&lt;Unit&gt;::iterator currentunit = UnitStack.top(); for (int i=0; i&lt;UnitStack.size(); i++) currentunit++; while (cur Probleme pour l'utilisation du type list de la STL [ par tanguy_laverdure ] Bonjour,J'ai 2 classes utilisant les list de STL. La classe RoundTrip contient une liste d'entier, la pas de probleme. La classe Solution contient une STL et C++ [ par tanguy_laverdure ] Bonjour, Quelqu'un saurait me dire comment choisir entre les list, vector, map et deque de la STL.Je croix comprendre que les temps d'acces sont a peu Itérateurs dans la STL [ par christouilhe ] Salut à vous tous !Oui, je sais, je suis nouveau sur ce sîte, mais je compte bien lui faire honneur !J'ai une question qui me turlupine en C++, ou plu List STL [ par gribgrib ] Salut,J'espere que quelqu'un pourra m'aiderVoila mon problème : j'insère des structures dans uns list mais une fois toutes mes structures insérées dan stl et compilation [ par markus3 ] Je passe une app Windows (que je n'ai pas developpé) sous IRIX (Unix pour les silicon graphics). Problème: à la compil, il me met un paquet d'erreurs


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,702 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales