PERFORMANCE DE DIFFÉRENTS CONTAINERS DE LA STL

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 11 mars 2011 à 19:41
cs_TeddyBear94 Messages postés 2 Date d'inscription dimanche 10 octobre 2010 Statut Membre Dernière intervention 31 mai 2011 - 14 mars 2011 à 10:57
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/52922-performance-de-differents-containers-de-la-stl

cs_TeddyBear94 Messages postés 2 Date d'inscription dimanche 10 octobre 2010 Statut Membre Dernière intervention 31 mai 2011
14 mars 2011 à 10: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.
shenron666 Messages postés 229 Date d'inscription dimanche 14 septembre 2003 Statut Membre Dernière intervention 20 août 2014
13 mars 2011 à 20:10
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
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
11 mars 2011 à 19:41
- Évite les "using namespace", voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace
- É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
# 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
#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 v;
std::list l;
std::queue q;
std::stack s;

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

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

return 0;
}