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

Windows Forms Discussion :

Try/catch : Combien ca coute ?


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut Try/catch : Combien ca coute ?
    Bonjour

    Je me posais une petite question simple :

    Insérer des block try/catch/finally, je sais que cela ampute les performances
    d'un programme...

    Mais j'aimerais savoir si quelqu'un a déja vu ou fait des rélevés de performances permettant de donner des métriques quand à l'utilisation du try/catch/finally
    dans une application .Net

    Dire que ca coute plus que de ne pas en mettre ok , mais quel cout ?

    The Monz, Toulouse

  2. #2
    Membre émérite Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 823
    Par défaut
    il n'y aurait pas une methode qui fait ces calculs ??? je crois que si... tu peux toujours la mettre en fin de code et tester...

    ceci-dis à un moment ces blocs sont nécessaires sinon ton programme risque de te petter à la figure.

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Février 2004
    Messages
    862
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2004
    Messages : 862
    Par défaut
    On en a déjà discuté au mois de juillet si ma mémoire est bonne, et j'avais donné un lien sur un article comportant un bench. Une petite recherche sur mes messages devrait te permettre de retrouver la conversation.

    Au cas où elle a été supprimé, l'essentiel en quelques points :

    • Ce qui coûte ce n'est pas tellement le try/finally, c'est surtout le catch.
    • D'expérience, 90% des "catch" sont inutilement placés.
    • Plus la complexité d'un traitement augmente, moins l'impact du "try/catch" est important.

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Par défaut
    Salut,

    comme dit au dessus, le try/catch en soit ne coute rien (enfin si quelques branchements, mais c'est un cout fixe quelque soit le contenu de ta methode). C'est l'instanciation de ton exception ainsi que le rassemblement d'infos (stacktrace, etc )qui va te couter, mais uniquement si une exception est lancée. Si aucune exception n'est lancée alors, le cout est 'negligeable', puisque tu as juste, comme je disais au dessus, quelques branchement (principalement pour eviter le bloc protégé 'catch' si aucune exception). D'ailleurs à premiere vue, la CLR n'a meme pas connaissance de ce bloc protégé si aucune exception n'intervient (je regarde dans la norme du CLI pour etre sur), il sait juste qu'arriver en fin de catch, il doit brancher inconditionnellement (leave) sur le retour (ou le finally le ca echeant).

  5. #5
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    Ok super pour la réponse

    Je marque en résolu... car les informations me comblent de bonheur
    (enfin, presque )

    The Monz, Toulouse

  6. #6
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    et pour compléter, pour perdre des perfs que quand c'est nécessaire et peu prévisible, il vaut mieux tester beaucoup de choses plutot que de traiter les plantages nativement !
    genre un dictionnaire, il vaut mieux tester avec contains puis accéder à la valeur plutot que de gérer un catch volontairement
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Par défaut
    Je viens de tester sur un petite source (perfectible, c'est juste pour voir la difference entre passage block protégé Vs passage bloc protégé + instanciation ex). Et ca confirme ce que je pensais. Le code :

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    class Program
        {
            static void Main()
            {
                int length = 100000;
                Stopwatch sw = new Stopwatch();
     
                sw.Start();
                for (int i = 0; i < length; i++)
                {
                    ExceptionFree.StaticMeth(true);
                }
                sw.Stop();
     
                Console.WriteLine(string.Format("Static no ex handler: {0} ticks ({1} ms)", sw.ElapsedTicks, sw.ElapsedMilliseconds));
                sw.Reset();
     
                sw.Start();
                for (int i = 0; i < length; i++)
                {
                    ExceptionThrow.StaticMeth(false);
                }
                sw.Stop();
     
                Console.WriteLine(string.Format("Static with handler no ex throw : {0} ticks ({1} ms)", sw.ElapsedTicks, sw.ElapsedMilliseconds));
                sw.Reset();
     
                sw.Start();
                for (int i = 0; i < length; i++)
                {
                    ExceptionThrow.StaticMeth(true);
                }
                sw.Stop();
     
                Console.WriteLine(string.Format("Static with handler ex throw: {0} ticks ({1} ms)", sw.ElapsedTicks, sw.ElapsedMilliseconds));
                sw.Reset();
     
                ExceptionFree e = new ExceptionFree();
                sw.Start();
                for (int i = 0; i < length; i++)
                {
                    e.InstanceMeth(true);
                }
                sw.Stop();
     
                Console.WriteLine(string.Format("Instance no ex handler: {0} ticks ({1} ms)", sw.ElapsedTicks, sw.ElapsedMilliseconds));
                sw.Reset();
     
                ExceptionThrow et = new ExceptionThrow();
                sw.Start();
                for (int i = 0; i < length; i++)
                {
                    et.InstanceMeth(false);
                }
                sw.Stop();
     
                Console.WriteLine(string.Format("Instance with handler no ex throw : {0} ticks ({1} ms)", sw.ElapsedTicks, sw.ElapsedMilliseconds));
                sw.Reset();
     
                sw.Start();
                for (int i = 0; i < length; i++)
                {
                    et.InstanceMeth(true);
                }
                sw.Stop();
     
                Console.WriteLine(string.Format("Instance with handler ex throw: {0} ticks ({1} ms)", sw.ElapsedTicks, sw.ElapsedMilliseconds));
                sw.Reset();
     
                Console.Read();
            }
     
        }
     
     
        class ExceptionFree
        {
            public static string StaticMeth(bool dummy)
            {
                if (dummy) { }
                return "Passed";
            }
     
            public string InstanceMeth(bool dummy)
            {
                if (dummy) { }
                return "Passed";
            }
        }
     
        class ExceptionThrow
        {
            public static string StaticMeth(bool throwEx)
            {
                try
                {
                    if (throwEx)
                        throw new Exception("Test");
     
                }
                catch (Exception ex)
                {
     
                }
                return "Passed";
            }
     
            public string InstanceMeth(bool throwEx)
            {
                try
                {
                    if (throwEx)
                        throw new Exception("Test");
     
                }
                catch (Exception ex)
                {
     
                }
                return "Passed";
            }
        }
    L'output debug :

    Static no ex handler: 4086 ticks (1 ms)
    Static with handler no ex throw : 5370 ticks (1 ms)
    Static with handler ex throw: 11910858 ticks (3327 ms)
    Instance no ex handler: 4413 ticks (1 ms)
    Instance with handler no ex throw : 5702 ticks (1 ms)
    Instance with handler ex throw: 12492151 ticks (3489 ms)
    et en release
    Static no ex handler: 365 ticks (0 ms)
    Static with handler no ex throw : 3501 ticks (0 ms)
    Static with handler ex throw: 11763809 ticks (3286 ms)
    Instance no ex handler: 364 ticks (0 ms)
    Instance with handler no ex throw : 3239 ticks (0 ms)
    Instance with handler ex throw: 11535896 ticks (3222 ms)
    D'ailleurs on peut voir que les optimisations en release n'impactent que peu les pertes de perf dues au throw de l'exception (donc cette perte est bien due à une instanciation/initialisation). On voit aussi que la perte de perf du à la simple presence du block protégé est vraiment negligeable.

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

Discussions similaires

  1. Builder n'accepte pas try/catch/__finally
    Par Rodrigue dans le forum C++Builder
    Réponses: 3
    Dernier message: 18/04/2005, 13h15
  2. __try __finally et try catch
    Par buzzz dans le forum C++
    Réponses: 6
    Dernier message: 19/02/2005, 15h31
  3. [debutant sous eclipse] surround with try catch
    Par Alwin dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 26/06/2004, 20h03
  4. [try-catch] relancer les instruction du bloc try
    Par nounou dans le forum Langage
    Réponses: 11
    Dernier message: 12/05/2004, 11h23
  5. Exception & Try..catch
    Par PurL dans le forum C++Builder
    Réponses: 2
    Dernier message: 11/12/2002, 15h35

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