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);
}
} |