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

Contribuez C++ Discussion :

De la rapidité du code [Trucs & Astuces]


Sujet :

Contribuez C++

  1. #181
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 670
    Points
    10 670
    Billets dans le blog
    3

  2. #182
    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
    Ah oui en effet, d'où le warning qui s'affichait qui disait que ça renvoyait toujours true :p.

    Par contre si j'ai une fonction template avec un type T, si c'est entier, un entier flottant... Je peux faire x = T(); et x vaut 0. Donc logiquement je peux faire int x = int() ?

  3. #183
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Si ça marchait comme ça, ça se saurait. Tu ne peux pas assurer que la variable sera initialisée à 0.

  4. #184
    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
    Ah bon ? Pourtant ça a toujours bien marché dans mes fonctions templates quand je faisais ça avec des types primitifs, sur mes deux compilos.

  5. #185
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Personnellement, sachant que dans certains cas, ça ne donne pas la bonne réponse - mode debug ou autres -, et prévoir ce genre de chose dans sa bibliothèque est indispensable, donc traits et quoiqu'il arrive le problème est réglé car résolu explicitement.

  6. #186
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Citation Envoyé par Bakura
    Par contre si j'ai une fonction template avec un type T, si c'est entier, un entier flottant... Je peux faire x = T(); et x vaut 0. Donc logiquement je peux faire int x = int() ?
    Oui. C'est une 0-initialisation (j'ai oublié le terme exact) connue et abondament utilisée dans le mode merveilleux des templates.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <iostream>
     
    int main (int argc, char **argv)
    {
        int i = int(); // inverser ne change rien
        int j;
     
        std::cout << "i:" << i << std::endl;;
        std::cout << "j:" << j << std::endl;;
        return 0;
    }
    (compilé avec GCC-cygwin (make en fait) sans option particulière (ni -g, ni -O; qui au demeurant ne changent pas grand chose))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    F:/cygwin/bin/bash.exe -c "./0-init.exe "
    i:0
    j:1628821313
    Hit any key to close this window...
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  7. #187
    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
    Ok donc c'est bien ça. Je me disais bien que je l'avais déjà vu plusieurs fois le coup du T() dans du code template .

  8. #188
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 50
    Points : 74
    Points
    74
    Par défaut
    Waouuaaaa Quels posts ...
    Alors les gourous, comment mieux optimiser cela
    Ici, les millisecondes prennent beaucoup d'importance.

    http://www.developpez.net/forums/sho...d.php?t=366832

    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
     
     //
    #include <cv.h>
    #include <highgui.h>
    #include <stdio.h>
    #include <cvcam.h>
    //
    int frame=0;
    //
    void callback(IplImage* img)
    {
         int i,j,k,x,y;
         int iwd=img->widthStep;
         char *idt=img->imageData;
         int channels  = img->nChannels;
         double t1=cvGetTickCount( );
         frame++;
         for (x=0;x<320;x++)
         {
             for (y=0;y<240;y++)
             {
    	idt[y*iwd+x*channels]=0; // Pixel Bleu
    	//idt[y*iwd+x*channels+1]=0; // Pixel Vert
    	//idt[y*iwd+x*channels+2]=0; // Pixel Rouge
             }
         }
        printf("Temps 1 %d %f \n",frame,cvGetTickCount( )-t1);
    }
     
    int main( int argc, char** argv )
    {
        int ncams = cvcamGetCamerasCount( );
        cvcamSetProperty(0, CVCAM_PROP_ENABLE     , CVCAMTRUE);
        cvcamSetProperty(0, CVCAM_PROP_CALLBACK   ,(void *)callback);
     
        if( !cvcamInit() ) return 0;
        cvcamStart();
     
        cvWaitKey(0);
        cvcamStop();
        cvcamExit();
    }

  9. #189
    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
    A part remplacer les x++ et y++ par ++x et ++y et remplacer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    for (x=0;x<320;x++)
         {
             for (y=0;y<240;y++)
             {
    	idt[y*iwd+x*channels]=0; // Pixel Bleu
    	//idt[y*iwd+x*channels+1]=0; // Pixel Vert
    	//idt[y*iwd+x*channels+2]=0; // Pixel Rouge
             }
         }
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    for (x=0;x<320;++x)
         {
            int xMult = x * channels;
             for (y=0;y<240;++y)
             {
    	idt[y*iwd+xMult]=0; // Pixel Bleu
    	//idt[y*iwd+x*channels+1]=0; // Pixel Vert
    	//idt[y*iwd+x*channels+2]=0; // Pixel Rouge
             }
         }
    Je ne vois pas, et puis le coup du ++x et x++ je ne pense pas que tu gagnes beaucoup, et le coup de calculer l'expression à l'extérieur de la boucle plutôt qu'à l'intérieur (parceque dans ton second for, le x*channels restera le même durant les 240 itérations), mais je pense que le compilo est assez intelligent pour faire cette optimisation lui même. Sinon, si tu ne modifies pas ton objet img, tu pourrais déclarer comme un pointeur constant (const IplImage * img).

    Sinon, si tu fais du C++, remplace printf par cout. Ca va rien améliorer mais c'est tout de suite plus beau

  10. #190
    Membre éclairé Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Points : 871
    Points
    871
    Par défaut
    Et peut-être permuter les deux boucles pour éviter les cache miss.

  11. #191
    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
    Le tutorial de GIL explique bien comment optimiser ce genre de choses.
    Boost ftw

  12. #192
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 50
    Points : 74
    Points
    74
    Par défaut
    @Bakura.

    Mince, j'ai loupé le coup du calcul a l'extérieur de la boucle Y. Merci.
    Le "printf n'est pas définitif mais c'est en effet une idée.
    Le compilateur ou plutot l'IDE c'est DEV C++ ou Code::Block. Le compilateur : MingW ou Gcc.
    Cela dit, comme tu le sais sans doute, Code::Block peut s'interfacer de plus avec OpenWatcom, Borland C++ 5.5, Visual C++ Toolkit 2003. Un de ces compilos est sans doute le meilleur?. Lequel?

    "Sinon, si tu ne modifies pas ton objet img, tu pourrais déclarer comme un pointeur constant (const IplImage * img)."

    Dans ce traitement l'image est modifiée mais l'idée est "mémorisée" pour les autres cas.

    @HanLee

    "Et peut-être permuter les deux boucles pour éviter les cache miss."
    Je suis largué. C'est presque du Chinois pour moi

    @loufoque

    Merci. Super lien

    Jean-Pierre.

  13. #193
    Membre actif Avatar de SKone
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 333
    Points : 250
    Points
    250
    Par défaut
    Il faut faire attention avec les i++ et les ++i dans un for il n'y a pas de problème mais dans un while c'est autre chose :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        int i = 10;
        while(i--)
            cout << i << endl;
        i = 10;
        cout << endl;
        while(--i)
            cout << i << endl;
    Citation Envoyé par console
    9
    8
    7
    6
    5
    4
    3
    2
    1
    0

    9
    8
    7
    6
    5
    4
    3
    2
    1
    Normal mais il faut juste ne pas l'oublier parce qu'en lisant le post j'ai entendu partout remplacer ça par ça truc par truc mais il faut toujours considérer le context... Voilà

  14. #194
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Un truc non abordé...
    On peut écrire cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (i=0, j=0 ; i<MAX ; i++, k+=4)
    {
      //du code
    }
    Mais est-ce mal ?
    J'avoue ne pas trouver grand chose à ce sujet...
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  15. #195
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Il faut juste que i et k soient du même type.

  16. #196
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Ah, mais alors, pourquoi ?
    J'aimerais bien avoir des détails à ce sujet...
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  17. #197
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    C'est comme ça, il faut que le retour de chaque instruction dans une instruction avec des ',' soit du même type.

  18. #198
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    C'est valable uniquement pour les boucles ou pour tout le reste ?

    Si c'était valable pour le reste, une instructionfree(ptr), ptr=NULL; ne compilerait pas...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  19. #199
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Autre question, doit-on essayer de remplacer certaines multiplications par des valeurs immédiates, par des additions/shift ?
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    x = -x1+3*x2+28*x3-3*x4
    Doit on réécrire ce code, ou bien le compilateur va-t-il faire quelque chose de très rapide ?
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  20. #200
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Le compilateur fera ce qu'il faudra.

Discussions similaires

  1. Réponses: 1
    Dernier message: 31/08/2014, 17h52
  2. Optimiser rapidité code
    Par bobosh dans le forum VBA Access
    Réponses: 2
    Dernier message: 28/08/2008, 16h12
  3. Optimisation code pour gagner en rapidité
    Par polodu84 dans le forum MATLAB
    Réponses: 2
    Dernier message: 05/03/2008, 15h32
  4. requete QBE / requete code : rapidité et index
    Par LostIN dans le forum Requêtes et SQL.
    Réponses: 11
    Dernier message: 05/07/2006, 08h54
  5. [rapidité du code] Mise a jour a partir d'un TQuery.
    Par goethe dans le forum Bases de données
    Réponses: 4
    Dernier message: 27/10/2004, 09h01

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