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 :

[Débutant] Optimisation d'un programme


Sujet :

C++

  1. #1
    Nouveau membre du Club Avatar de velociraptor5679
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2006
    Messages : 64
    Points : 39
    Points
    39
    Par défaut [Débutant] Optimisation d'un programme
    De quelle manière puis-je optimiser mon programme ? :

    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
     
    #include <iostream>
     
    using namespace std;
     
    int main(int argc, char *argv[])
    {
        string chaine=argv[1],      cryptee="",     clef=argv[2];    
     
        if (argv[1]==NULL || argv[2]==NULL)
           cout << "Utilisation :" << endl << "CRYPT chaine clef" << endl;
        else
        {
            for (int i(0); i<chaine.length(); ++i)
                cryptee += chaine[i] ^ clef [ i % clef.length() ];
            cout << cryptee;
        }
     
        return 0;
    }

  2. #2
    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
    Avant de l'optimiser, essaie d'abord de le corriger pour que
    Ne coupe pas la chaîne...
    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.

  3. #3
    Nouveau membre du Club Avatar de velociraptor5679
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2006
    Messages : 64
    Points : 39
    Points
    39
    Par défaut
    ben il marche

  4. #4
    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
    Pas avec le code que tu me montres: Si un caractère de la chaîne de départ est le même que celui correspondant de la clé, c'est un \0 que tu rajoutes...

    Edit: Je viens de tester, alors j'ajoute:
    1. Que tu as oublié le header <string>,
    2. Que je la chaîne cryptée s'arrête effectivement au bout de trois caractères comme je l'avais dit,
    3. Que c'est pas prudent d'afficher une chaîne pouvant contenir des caractères <32...
      En testant le programme avec les paramètres déjà mentionnés sur un serveur FreeBSD, le prog m'affiche des caractères de contrôle qui m'effacent l'écran...
    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.

  5. #5
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut
    Voilà ce que j'aurais fait, (pour les test):

    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
    #include <iostream>
    #include <cstdlib>
    using namespace std;
     
    int main(int argc, char *argv[])
    {
        if(argc<3){
           cout << "Utilisation :" << endl << "CRYPT chaine clef" << endl;
           return EXIT_FAILURE;
        }
     
        string chaine=argv[1],      cryptee="",     clef=argv[2];    
     
        for (int i(0); i<chaine.length(); ++i)
            cryptee += chaine[i] ^ clef [ i % clef.length() ];
     
        cout << cryptee;
     
        return EXIT_SUCESS;
    }

  6. #6
    Nouveau membre du Club Avatar de velociraptor5679
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2006
    Messages : 64
    Points : 39
    Points
    39
    Par défaut
    Pas avec le code que tu me montres: Si un caractère de la chaîne de départ est le même que celui correspondant de la clé, c'est un \0 que tu rajoutes...
    oui c'est normal

  7. #7
    Nouveau membre du Club Avatar de velociraptor5679
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2006
    Messages : 64
    Points : 39
    Points
    39
    Par défaut
    Citation Envoyé par MatRem
    Voilà ce que j'aurais fait, (pour les test):

    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
    #include <iostream>
    #include <cstdlib>
    using namespace std;
     
    int main(int argc, char *argv[])
    {
        if(argc<3){
           cout << "Utilisation :" << endl << "CRYPT chaine clef" << endl;
           return EXIT_FAILURE;
        }
     
        string chaine=argv[1],      cryptee="",     clef=argv[2];    
     
        for (int i(0); i<chaine.length(); ++i)
            cryptee += chaine[i] ^ clef [ i % clef.length() ];
     
        cout << cryptee;
     
        return EXIT_SUCESS;
    }

    pas mal...

  8. #8
    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
    Citation Envoyé par velociraptor5679
    oui c'est normal
    Ben non, c'est pas normal.
    C'est ton algo de cryptage qui est foireux, c'est à corriger.
    (je sais que c'est facile, j'ai déjà eu à faire cette correction-là).
    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.

  9. #9
    Nouveau membre du Club Avatar de velociraptor5679
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2006
    Messages : 64
    Points : 39
    Points
    39
    Par défaut
    Citation Envoyé par Médinoc
    Ben non, c'est pas normal.
    C'est ton algo de cryptage qui est foireux, c'est à corriger.
    (je sais que c'est facile, j'ai déjà eu à faire cette correction-là).
    Excuse, je débute alors je comprends pas très bien : \0 est un caractère comme les autres de la table ASCII...

    Pourquoi doit-il être éliminé ?

  10. #10
    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
    Parce qu'il termine la chaîne, voilà pourquoi.
    Donc, dans du cryptage de chaîne, il doit être éliminé.
    Dans du cryptage binaire, il doit rester, bien sûr.
    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.

  11. #11
    Nouveau membre du Club Avatar de velociraptor5679
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2006
    Messages : 64
    Points : 39
    Points
    39
    Par défaut
    Citation Envoyé par Médinoc
    Parce qu'il termine la chaîne, voilà pourquoi.
    Donc, dans du cryptage de chaîne, il doit être éliminé.
    Dans du cryptage binaire, il doit rester, bien sûr.

    j'ai essayé avec : et il m'affiche , donc ça marche

  12. #12
    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
    1. Tu as mis des vraies étoiles ou non? Tu peux afficher la chaîne et la clé dans ton programme pour vérifier ? (+ la longueur de la chaîne, la clé et la chaîne cryptée)
    2. Quelle plate-forme ? J'ai testé sous un FreeBSD qui a fait ses preuves... L'opérateur << de string dépend sans doute de l'implémentation (comportement indéterminé). Avec cryptee.c_str(), le comportement sera le même partout (échec).
    3. "Chez moi ça marche" n'est jamais une excuse, surtout pour des trucs comme ça
    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.

  13. #13
    Nouveau membre du Club Avatar de velociraptor5679
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2006
    Messages : 64
    Points : 39
    Points
    39
    Par défaut
    Citation Envoyé par Médinoc
    1. Tu as mis des vraies étoiles ou non? Tu peux afficher la chaîne et la clé dans ton programme pour vérifier ? (+ la longueur de la chaîne, la clé et la chaîne cryptée)
    2. Quelle plate-forme ? J'ai testé sous un FreeBSD qui a fait ses preuves... L'opérateur << de string dépend sans doute de l'implémentation (comportement indéterminé). Avec cryptee.c_str(), le comportement sera le même partout (échec).
    3. "Chez moi ça marche" n'est jamais une excuse, surtout pour des trucs comme ça

    1) oui. oui.
    2) WinXP
    3) je constate, c'est tout

  14. #14
    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
    Sinon, comme optimisation, je ne vois pas grand-chose, à part réserver à l'avance de l'espace dans la chaîne cryptée (un petit reserve())...
    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.

  15. #15
    Nouveau membre du Club Avatar de velociraptor5679
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2006
    Messages : 64
    Points : 39
    Points
    39
    Par défaut
    Citation Envoyé par Médinoc
    Sinon, comme optimisation, je ne vois pas grand-chose, à part réserver à l'avance de l'espace dans la chaîne cryptée (un petit reserve())...

    OK merci...
    pourquoi le fait de réserver à l'avance optimise ?

  16. #16
    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
    pourquoi le fait de réserver à l'avance optimise ?
    Pour être sûr qu'il ne fasse pas une réallocation à chaque caractère ajouté (dépend de l'implémentation encore).



    Sinon, code: http://www.isty-info.uvsq.fr/~fbenoi.../testCrypt.cpp

    Résultat sous FreeBSD 4.10:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    --- Test : TestCrypt ---
    Chaine : "Frederic" (Longueur : 8)
    Clef   : "1code" (Longueur : 5)
    Chaine Cryptee : "w
    C
    " (Longueur : 8)
    Cryptee.c_str  : "w
    " (Longueur : 8)
     
    --- Test : TestCrypt ---
    Chaine : "ccc***" (Longueur : 6)
    Clef   : "c" (Longueur : 1)
    Chaine Cryptee : "III" (Longueur : 6)
    Cryptee.c_str  : "" (Longueur : 6)
    Résultat sous Windows XP:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    --- Test : TestCrypt ---
    Chaine : "Frederic" (Longueur : 8)
    Clef   : "1code" (Longueur : 5)
    Chaine Cryptee : "w◄
      C
    ♀" (Longueur : 8)
    Cryptee.c_str  : "w◄
    " (Longueur : 8)
     
    --- Test : TestCrypt ---
    Chaine : "ccc***" (Longueur : 6)
    Clef   : "c" (Longueur : 1)
    Chaine Cryptee : "   III" (Longueur : 6)
    Cryptee.c_str  : "" (Longueur : 6)
    Résultat sous une RedHat non-identifiée (mais récente):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    --- Test : TestCrypt ---
    Chaine : "Frederic" (Longueur : 8)
    Clef   : "1code" (Longueur : 5)
    Chaine Cryptee : "w
    C
    " (Longueur : 8)
    Cryptee.c_str  : "w
    " (Longueur : 8)
     
    --- Test : TestCrypt ---
    Chaine : "ccc***" (Longueur : 6)
    Clef   : "c" (Longueur : 1)
    Chaine Cryptee : "III" (Longueur : 6)
    Cryptee.c_str  : "" (Longueur : 6)
    Tu vois, dès qu'on passe sous un unixoïde, les \0 disparaissent de la string.
    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.

  17. #17
    Nouveau membre du Club Avatar de velociraptor5679
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2006
    Messages : 64
    Points : 39
    Points
    39
    Par défaut
    ok j'ai tout compris merci Médinoc... merci pour les tests aussi

  18. #18
    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
    Au fait, tu as vu, dans les deux cas, la "longueur" est celle retournée par length().
    Si j'avais fait le test de c_str() avec strlen(), la longueur aurait été différente...
    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. #19
    Nouveau membre du Club Avatar de velociraptor5679
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2006
    Messages : 64
    Points : 39
    Points
    39
    Par défaut
    oui, je vois

  20. #20
    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
    En toute honnêteté, je ne vois pas ce que tu vas gagner avec un programme pareil. Limite tu vas passer plus de temps à lancer ton exécutable en boucle depuis le shell.

    Sinon, éliminer les appels et les tests, ce peut être pas mal.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    const size_t L = strlen(argv[1]);
    const size_t C = strlen(argv[2])-1; // il y a un -1 ici !
    char * cryptee = new char[L+1]; // une seule alloc, pas d'initialisation par défaut
    for (int l=L-1,c=C ; l>=0 ; --l,--c)
        crypte[l] = chaine[l] ^ clef[c];
        if (c == 0) c=C;
    } // suivant les proc/OS, le test à 0 est plus efficace que le test à constante
    crypte[L] = 0;
    cout.write(crypte,L);
     
    delete[] cryptee; // Dans ce code, il n'y aura pas d'exception entre le new et le delete, 
    // => on peut bourriner avec les char* + new[] et delete[].
    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...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Débutant] Pause dans un programme en mode console ?
    Par pugnator dans le forum Langage
    Réponses: 2
    Dernier message: 15/12/2006, 12h08
  2. Réponses: 11
    Dernier message: 12/12/2006, 00h53
  3. [débutant] arret brutal du programme
    Par ~Brouette~ dans le forum C
    Réponses: 16
    Dernier message: 16/11/2006, 17h12
  4. Optimisation d'un programme d'échecs
    Par Erickann dans le forum x86 32-bits / 64-bits
    Réponses: 8
    Dernier message: 23/11/2005, 20h23
  5. Réponses: 7
    Dernier message: 24/01/2005, 11h36

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