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 :

mesure temps d'execution d'une methode


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2009
    Messages
    83
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Novembre 2009
    Messages : 83
    Par défaut mesure temps d'execution d'une methode
    Bonjour,

    soit des méthodes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     public void methode1()
    {methode2();}
     public void methode2()
    { methode3();}
     public void methode3(){}
    je voudrais mesurer le temps d’exécution de la méthode 1 + le temps qu'il a passé dans les methodes 2 et 3. (pour le même appel)
    pour le moment j'utilise stopwatch() pour mesurer le temps d’exécution de la methode1.
    il y aurait il une extension ou une méthode permettant de faire cela?

  2. #2
    Membre Expert
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Par défaut
    Bonjour,

    L'idéal dans ton cas serait de pouvoir étendre le type StopWatch pour lui ajouter une méthode statique, sauf qu'en C# on peut pas faire une extension statique au pire. On pourrait sinon étendre Func et Action sauf que l'utilisation s'en retrouve plus verbeuse ; bref voici les divers choix que je suggère (sans trop savoir lequel est le plus adapté )

    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
    // Extensions sur StopWatch
    static class StopWatchExtensions
    {
        // Version 1 ; renvoi du résultat + renvoi du temps en paramètre out
        // Exemple d'utilisation
        // TimeSpan elapsed;
        // int result = new Stopwatch().Measure(() => 42, out elapsed);
        // Défaut: obliger d'instancier alors qu'une méthode statique serait préférable
        public static T Measure<T>(this Stopwatch sw, Func<T> body, out TimeSpan elapsed)
        {
            sw.Restart();
            T result = body();
            elapsed = sw.Elapsed;
            return result;
        }
     
        // Version 1 ; renvoi du temps en paramètre out (on pourrait le renvoyer par la méthode au lieu de void, mais j'essaie de rester constant avec l'autre prototype)
        // Exemple d'utilisation
        // TimeSpan elapsed;
        // new Stopwatch().Measure(() => Console.Write("Hello"), out elapsed);
        // Défaut: obliger d'instancier alors qu'une méthode statique serait préférable
        public static void Measure<T>(this Stopwatch sw, Action body, out TimeSpan elapsed)
        {
            sw.Restart();
            body();
            elapsed = sw.Elapsed;
        }
     
        // Version 2 ; Utilisation d'une continuation, pour exploiter le résultat et le temps
        // Exemple d'utilisation
        // new Stopwatch().Measure(() => 42, (result, elapsed) => Console.WriteLine("{0} in {1}", result, elapsed));
        // Défaut: obliger d'instancier alors qu'une méthode statique serait préférable
        public static void Measure<T>(this Stopwatch sw, Func<T> body, Action<T, TimeSpan> continuation)
        {
            sw.Restart();
            T result = body();
            continuation(result, sw.Elapsed);
        }
     
        // Version 2 ; Utilisation d'une continuation, pour exploiter le temps (également je garde la même constance d'utilisation)
        // Exemple d'utilisation
        // new Stopwatch().Measure(() => Console.Write("Hello"), elapsed => Console.WriteLine(" execution: {0}", elapsed));
        // Défaut: obliger d'instancier alors qu'une méthode statique serait préférable
        public static void Measure<T>(this Stopwatch sw, Action body, Action<TimeSpan> continuation)
        {
            sw.Restart();
            body();
            continuation(sw.Elapsed);
        }
    }
     
    static class DelegateExtensions // nom pas forcément le plus adapté)
    {
        // Version 1 ; renvoi du résultat + renvoi du temps en paramètre out
        // Exemple d'utilisation
        // TimeSpan elapsed;
        // int result = new Func<int>(() => 42).Measure(out elapsed);
        // Défaut: obliger  de créer "verbeusement" l'expression lambda
        public static T Measure<T>(this Func<T> body, out TimeSpan elapsed)
        {
            var sw = Stopwatch.StartNew();
            T result = body();
            elapsed = sw.Elapsed;
            return result;
        }
     
        // Version 1 ; renvoi du temps en paramètre out (idem constance)
        // Exemple d'utilisation
        // TimeSpan elapsed;
        // new Action(() => Console.Write("Hello")).Measure(out elapsed);
        // Défaut: obliger  de créer "verbeusement" l'expression lambda
        public static void Measure(this Action body, out TimeSpan elapsed)
        {
            var sw = Stopwatch.StartNew();
            body();
            elapsed = sw.Elapsed;
        }
     
        // Version 2 ; Utilisation d'une continuation, pour exploiter le résultat et le temps
        // Exemple d'utilisation
        // new Func<int>(() => 42).Measure((result, elapsed) => Console.WriteLine("{0} in {1}", result, elapsed));
        // Défaut: obliger  de créer "verbeusement" l'expression lambda
        public static void Measure<T>(this Func<T> body, Action<T, TimeSpan> continuation)
        {
            var sw = Stopwatch.StartNew();
            continuation(body(), sw.Elapsed);
        }
     
        // Version 2 ; Utilisation d'une continuation, pour exploiter le temps (idem constance)
        // Exemple d'utilisation
        // new Action(() => Console.Write("Hello")).Measure(elapsed => Console.WriteLine(" execution: {0}", elapsed));
        // Défaut: obliger  de créer "verbeusement" l'expression lambda
        public static void Measure(this Action body, Action<TimeSpan> continuation)
        {
            var sw = Stopwatch.StartNew();
            body();
            continuation(sw.Elapsed);
        }
    }
    À voir maintenant, au passage, je suis preneur, de ceux qui ont trouvé une solution

    P.S. À titre informatif voilà comment cela pourrait se faire en F# (enfin avec mon niveau ):
    Code F# : 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
    // Extension du type Stopwatch
    type Stopwatch with
      // oui on peut ajouter une méthode statique
      static member Measure body =
        let sw = Stopwatch.StartNew ()
        let result = body ()
        (result, sw.Elapsed)
     
      static member Measure (body, continuation) =
        continuation (Stopwatch.Measure body)
     
    // Utilisation
    // ici Measure renvoie un tuple 'T, TimeSpan, je peux récupérer séparément les valeurs.
    let (result, elapsed) = Stopwatch.Measure (fun () -> 42)
     
    // ici Measure renvoie un tuple unit, TimeSpan ; (unit étant, pour faire court un équivalent de void, mais récupérable), j'utilise donc _ pour correspondre au pattern sans toutefois vouloir stocker cette partie là.
    let (_, elapsed) = Stopwatch.Measure (fun () -> printf "Hello")
     
    // versions avec continuation:
    Stopwatch.Measure ((fun () -> 42), fun (result, elapsed) -> printfn "%d in %A" result elapsed)
     
    Stopwatch.Measure ((fun () -> printf "Hello"), fun (_, elapsed) -> printfn " execution: %A" elapsed)
    Cordialement !

Discussions similaires

  1. Réf : Mesurer le temps d 'execution d 'une requete
    Par akrabmehdi dans le forum SQL
    Réponses: 1
    Dernier message: 10/07/2007, 20h48
  2. Mesurer le temps d'éxécution d'une méthode
    Par bhahmed dans le forum C++Builder
    Réponses: 19
    Dernier message: 02/12/2006, 18h00
  3. [Stratégie] Mesurer le temps d'exécution d'une requête
    Par nice dans le forum Général Java
    Réponses: 5
    Dernier message: 29/01/2006, 17h53
  4. Récupérer le temps d'execution d'une methode
    Par Janitrix dans le forum Général Java
    Réponses: 3
    Dernier message: 17/12/2005, 11h01
  5. [VB.NET] Temps d'éxécution d'une page...
    Par Webman dans le forum ASP.NET
    Réponses: 3
    Dernier message: 04/06/2004, 12h20

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