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 :

[Optimisation] Mon code est extremement lent .


Sujet :

C++

  1. #1
    Membre habitué
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Points : 164
    Points
    164
    Par défaut [Optimisation] Mon code est extremement lent .
    Bonjour, j'ai un code que je trouve d'une lenteur abominable, mais je ne comprend pas pourquoi . Je dois créer deux double tableau de dimension 2048*2048 . Je procède ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    	StringPixel.resize(I.Largeur);
    	Traite.resize(I.Largeur);
    	for (unsigned int i = 0 ; i < I.Largeur ; i ++ )
    	{
    		StringPixel[i].resize(I.Hauteur);
    		Traite[i].resize(I.Hauteur);
     
    		for ( unsigned int j = 0 ; j < I.Largeur ; j++)
    		{
    			StringPixel[i][j] = "" ;
    			Traite[i][j] = false ;
    		}
    	}
    Ce code met plus de 1 minutes ( je me suis arreter a une minute, il est possible qu'il mette bien plus) pour s'éxécuter ! ( ~5 seconde sans la seconde boucle ). Ca me parait énorme, ou alors je ne m'y rpend pas correctement?

    [ J'envisagerai d'utiliser des tableaux statiques, mais pour le principe je me demande pourquoi c'est si lent avec des vector ]

    EDIT : Simplment la déclaration de bool B[2048][2048] fait planter le prog a l'éxécution, sur une machine de 1go de ram c'est nromal ? (je vais prendre ma calculette pr voir ca :p )

    EDIT 2: Probleme résolu a priori, je suis passé en mode "Release" au lieu de "Debug", et ca va toute de suite mieux.

  2. #2
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    En effet c'est pas censé être si long .

    Il y a sûrement moyen de faire mieux, les gurus du forum vont sûrement de donner les techniques, mais perso je propose ça :

    std::vector <std::vector <std::string> > tab (2048);

    for (std::vector<std::string>::size_type t = 0 ; t != tab.size() ; ++t)
    {
    tab.at(t).resize (2048);
    }

    Sinon, un vector de bool c'est déconseillé pour des raisons que je ne me souviens plus, mais les autres vont sûrement t'expliquer .

    EDIT alors : 1.156 seconde en mode debug.
    EDIT 2 : et 0.250 seconde en mode release. Je pensais pas que la différence était si grande , qu'est-ce que release fait de plus ?

  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
    Si T est ton type contenu dans ta structure std::vector<std::vector<T> >, alors tu fais une allocation de 2048*sizeof(std::vector<T>) octets + 2048 allocations de 2048*sizeof(T) octets.
    Alors qu'en fait, il te suffirait d'allouer une fois 2048*2048*sizeof(T) octets.

    EDIT : Simplment la déclaration de bool B[2048][2048] fait planter le prog a l'éxécution, sur une machine de 1go de ram c'est nromal ? (je vais prendre ma calculette pr voir ca :p )
    La pile a généralement une taille fort limitée.

    Donc tu peux faire ça de plusieurs façons :
    std::vector<T> v(2048*2048), puis quand tu veux accéder à v[i][j] en fait tu fais v[i * 2048 + j]
    ou alors, plus simple,
    std::vector<std::array<T, 2048> > v(2048) et tu peux directement écrire v[i][j].
    ou alors, éventuellement,
    boost::multi_array<T, 2> v(boost::extents[2048][2048]); et tu peux là aussi écrire v[i][j].
    Boost ftw

  4. #4
    Membre habitué
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Points : 164
    Points
    164
    Par défaut
    Merci, je voios bien l'enjeu du problème ! je laiss en on réoslu si quelqu'un peux renseigner Bakura sur els différence degub/release, je dirai ( à prendre avec des pincettes) que c'est propre au compilateur et que celui-ci ajoute aps mal d'information à ton code te permetttant de debugger le tout plus tard .

  5. #5
    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
    Il y a sûrement moyen de faire mieux, les gurus du forum vont sûrement de donner les techniques, mais perso je propose ça :

    std::vector <std::vector <std::string> > tab (2048);
    // puis un resize à chaque itération
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<std::vector<std::string> > tab(2048, std::vector<std::string>(2048));
    Boost ftw

  6. #6
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par loufoque
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<std::vector<std::string> > tab(2048, std::vector<std::string>(2048));
    C'est plus court à écrire mais bien plus long à l'exécution (copie de 4 millions de string en plus).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. BDD Access - mon code est trop lent !
    Par alexbesn2 dans le forum C#
    Réponses: 1
    Dernier message: 07/05/2009, 11h37
  2. Pourquoi mon code est plus lent que Arrays.sort
    Par alexis779 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 12/12/2006, 12h44
  3. [VB.Net 1.1/ASP.Net/Excel] Pourquoi mon exécution de code est si lente ?
    Par calison3 dans le forum Accès aux données
    Réponses: 2
    Dernier message: 12/08/2006, 12h41
  4. OPTIMISER mon code
    Par valoji dans le forum Bases de données
    Réponses: 3
    Dernier message: 14/03/2006, 18h45
  5. Optimiser mon code ASP/HTML
    Par ahage4x4 dans le forum ASP
    Réponses: 7
    Dernier message: 30/05/2005, 10h29

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