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 :

exeption et performance


Sujet :

C++

  1. #1
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut exeption et performance
    Bonjour,
    est il vrai que les exceptions plombe les performance d'un code?

    merci

  2. #2
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Par défaut
    je sais pas exactement, mais on peut penser que oui car instruction en plus = temps en plus... Mais bon c'est pas non plus un calcul matricielle...

    mais meme si c'était faux, un code qui devrait générer des exceptions et qui ne le fais pas, ne sers pas a grand choses à mon avis...

  3. #3
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    En gros, il y a differentes techniques pour implementer les exceptions. Elles offrent des compromis differents entre "surcout du a la possibilite d'avoir des exceptions quand il n'y a pas d'exception" et "cout de l'exception quand elle est presente". Une technique en particulier permet d'avoir un surcout en l'absence d'exception quasiment nul (des effets indirects sur les optimisations).

    Certains OS ont aussi une notion d'exception. Lier les exceptions du C++ a celle de l'OS a alors des avantages -- compatibilite interlangage plus forte par exemple -- mais aussi des inconveniants -- on ne peut pas utiliser le compromis qu'on voudrait, parfois il existe pour le C++ des methodes qui sont meilleures sur les deux tableaux.

    Naturellement, il faut comparer le cout des exceptions avec celui des alternatives qui ne sont pas gratuites non plus.

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par ZaaN
    mais meme si c'était faux, un code qui devrait générer des exceptions et qui ne le fais pas, ne sers pas a grand choses à mon avis...
    Ma question et pour la gestion d'erreur dans mes class. Comme il y as plusieurs philosophie de gestion d'erreur, je me demandé si les exeption sont lent ou non.

  5. #5
    Expert confirmé

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

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Tu as tant d'erreurs exceptionnelles que ca pour que les exceptions aient un impact significatif sur les performances de ton logiciel ?
    http://gamearchitect.net/Articles/Ex...rrorCodes.html

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par Aurelien.Regat-Barrel
    Tu as tant d'erreurs exceptionnelles que ca pour que les exceptions aient un impact significatif sur les performances de ton logiciel ?
    C'est plus pour de la culture générale.
    Avant de dire "les exeptions c'est cool", c'est bien de le savoir pourquoi. Et quand se sont les perf (lancer de rayon, traitement image ...) qui rentre en jeux, ça peut jouer sur la philosophie utilisé pour les erreurs.

    merci pour le lien

  7. #7
    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
    Par défaut
    Voir ce fil très poussé sur comp.lang.c++.moderated
    http://groups.google.com/group/comp....4c9b3e3509403/

    Certaines implémentations n'ont aucun coût en performance dans le cas où aucune erreur ne survient (quand aucune exception n'est levée).
    Ce qui signifie donc que c'est plus performant que des if/else et valeurs de retour dans ce cas.

    Une technique en particulier permet d'avoir un surcout en l'absence d'exception quasiment nul (des effets indirects sur les optimisations).
    D'après le thread que je viens de mentionner, on peut même avoir un surcoût parfaitement nul, du moins en temps d'exécution.

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    merci pour les reponses

  9. #9
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 292
    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 292
    Par défaut
    J'étais tombé sur cela http://gamearchitect.net/Articles/Ex...rrorCodes.html
    qui est une approche assez pratique et ciblée.

    À l'occasion, je lirai le fil sur clc++m, merci pour le lien.
    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...

  10. #10
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut,

    Cela ne fera sans doute pas avancer le débat, mais je me permets de vous livrer le fruit de ma réflection... Meme s'il est relativement simpliste en son genre.

    En toute logique, une exception est lancée quand un événement qui n'aurait pas du arriver - et ce, quelle que soit la raison - survient.

    Le résultat direct, c'est que l'état dans lequel se trouve l'application ne correspond plus à l'état dans lequel elle est sensée se trouver...

    Si l'application ne retrouve pas rapidement un état normal, cela pourra mener à des catastrophes, que ce soit du fait d'aberrations de résultats ou du fait du plantage pur et simple de l'application.

    Des lors, et meme si le fait de lancer une exception - et sans doute aussi de la gérer - venait à couter énormément de temps, n'est il pas sensé d'estimer préférable de prendre le temps qu'il faut pour que l'application retrouve un état correct

    Maintenant, je n'ai pris en compte que la perte de temps encourrue par le fait qu'une exception survienne... Et je présumes que, la question portait sur les pertes de performances dues au fait de la traquer... et sans doute, car c'est la regle générale espérée, quand elles ne surviennent justement pas
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  11. #11
    Expert confirmé

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

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Moi aussi j'ai pas mal réfléchi et me suis beaucoup documenté sur le sujet a un moment
    Les exceptions ne sont qu'un mécanisme de transport des erreurs. J'étais tombé sur un excellent article débatant autour de ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    std::exception test1()
    {
        if ( error ) return std::exception( "erreur" );
    }
     
    #define ERROR 1
    void test2()
    {
        if ( error ) throw ERROR;
    }
    Une classe exception peut etre utilisée comme code de retour, et un code d'erreur comme exception...

    La vraie question qu'il faut se poser est : qui va traiter mon erreur ? Si l'appelant de la fonction est le plus a meme de réagir a l'erreur, un code de retour est préférable. Sinon, une exception peut etre judicieuse.
    Pour moi, les codes de retour sont le chemin des erreurs classiques attendues, et les exceptions un mécanisme d'erreur parallele, plus grave, moins prévisible et souvent difficile a résoudre.

  12. #12
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Citation Envoyé par Aurelien.Regat-Barrel
    La vraie question qu'il faut se poser est : qui va traiter mon erreur ? Si l'appelant de la fonction est le plus a meme de réagir a l'erreur, un code de retour est préférable. Sinon, une exception peut etre judicieuse.
    Il y a, je pense, des cas où l'appelant peut être prévenu par un mécanisme d'exception.
    Dans un de mes modules récemment, je devais récupérer un fichier sur un serveur, le décompresser si nécéssaire (car tous les fichiers n'étaient pas compressés), puis appliquer des traitements dessus...
    J'ai choisi la méthode de:
    1) Tenter la décompression avec Boost::gzip
    2) Si OK tant mieux, on continue. Sinon boost lance une exception de mauvais format d'en-tête. L'exception est attrapée puis relancée pour que l'appelant l'attrappe à son tour.
    3) L'appelant sait alors que le fichier n'est pas compressé et peut donc travailler directement dessus!

    Parfois, la meilleure méthode pour savoir si on peut faire quelquechose, c'est de la tenter. (cf inversion de matrices !)

  13. #13
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par défaut
    Citation Envoyé par poukill
    2) Si OK tant mieux, on continue. Sinon boost lance une exception de mauvais format d'en-tête. L'exception est attrapée puis relancée pour que l'appelant l'attrappe à son tour.
    pourquoi l'attrapper si c'est pour la relancer après alors que c'est le comportement par défaut? A moins qu'il n'y ait un traitement spécifique..

  14. #14
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Pour qu'elle soit attrappée par le code qui appelle la fonction qui vient de l'attrapper.

  15. #15
    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
    Par défaut
    Les exceptions n'ont pas besoin d'être appelées puis relancées pour être propagées à l'appelant.
    C'est tout l'intérêt.

  16. #16
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Euh... ça me ferait mettre un bloc try{ } sans catch dans la fonction appelé.
    Le bloc catch serait uniquement dans la fonction appelante c'est bien ça?

  17. #17
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Citation Envoyé par poukill
    Euh... ça me ferait mettre un bloc try{ } sans catch dans la fonction appelé.
    Le bloc catch serait uniquement dans la fonction appelante c'est bien ça?
    Pas besoin de try tout seul (d'ailleurs ça n'aurait aucun sens), l'exception remontera toute seule comme une grande jusqu'au premier catch correspondant.

  18. #18
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Bon...
    Encore une boulette de Poukill !

    Merci Laurent!

  19. #19
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    En fait, tu ne dois mettre un bloc catch (et son try correspondant) que si tu veux/dois gérer quelque en cas d'exception, et que cette gestion ne peut pas etre remise plus tard...

    Ainsi, il se peut que, dans l'ordre d'appel des fonctions, tu ne dispose pas tout de suite des informations nécessaire à la gestion de l'exception
    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
     
    void fonct1()
    {
        /* ce n'est que dans fonct1 qu'on peut traiter l'exception */
        try
        {
            fonct2();
        }
        catch(ton_exeption &e)
        {
            /* traitement de l'exeption */
        }
    }
    void fonct2()
    {
        /* fonct2() n'a pas tous les éléments pour traiter l'exeption */
        fonct3();
    }
    void fonct3()
    {
        /* C'est ici qu'on décide de lancer l'exeption */
        if (a==0)
            throw ton_exeption;
    }
    Par contre, il se peut que aussi bien fonct3 que fonct2 doivent prendre en charge *une partie* de la gestion de l'exeption et que le système ne revienne dans un état normal qu'apres que fonct1 aie pris en charge la fin de la gestion de l'exeption...

    A ce moment là, cela devient:
    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
     
    void fonct1()
    {
        try
        {
            fonct2();
        }
        catch(exept2 &e)
       {
            /* fin du traitement de l'exeption */
       }
    }
    void fonct2()
    {
        try
        {
            fonct3();
        }
        catch(exeption &)
        {
             /* partie du traitement */
             /* on relance l'exeption apres traitement, et rien n'oblige à 
              * relancer la meme exeption ;) */
             throw exept2(/*...*/);
        }
    }
    void fonct3()
    {
        try
        {
            /* c'est ici que l'exeption "primaire" survient
            if(a==0)
                throw exeption(/*...*/);
        }
        catch(exeption &e)
        {
            /*fonct3 peut gérer une partie de l'exeption... et la relancer pour
             *la fonction appelante */
            throw e;
        }
    }
    Et bien sur, entre ces deux extrème, il y a toutes les variations possible
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  20. #20
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Donc au final, utiliser les exeption pour tout type d'erreur est un bonne methode?
    ou faut 'il laisser les execptions au cas grave, et faire des retour d'erreur pour le reste?
    ou c'est au choix?

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

Discussions similaires

  1. [maintenance][performance] Que faire comme maintenance ?
    Par woodwai dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 06/11/2003, 15h39
  2. Performance xml
    Par MicKCanE dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 07/07/2003, 06h41
  3. [ POSTGRESQL ] Problème de performance
    Par Djouls64 dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 26/05/2003, 16h18
  4. [JDBC][connexion persistante] performances avec JDBC
    Par nawac dans le forum Connexion aux bases de données
    Réponses: 6
    Dernier message: 06/05/2003, 10h37
  5. performance entre 3DS, ase, asc ...
    Par amaury pouly dans le forum OpenGL
    Réponses: 3
    Dernier message: 24/03/2003, 11h41

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