98 votes

Emballage calendrier de chronomètre avec un délégué ou un lambda ?

Je vous écris code comme celui-ci, fait un petit moment rapide et sale :

Il y a sûrement un moyen pour appeler ce morceau de code de synchronisation comme une fantaisie-schmancy .NET 3.0 lambda plutôt (Dieu nous en préserve) couper et coller quelques fois et remplaçant la `` avec `` ?

Je sais que cela peut être fait comme un `` mais je m’interroge sur le lambda moyen.

134voto

Matt Hamilton Points 98268

Que diriez-vous s’étendant la classe Stopwatch ?

Puis appelez-le comme ceci :

Vous pouvez ajouter une autre surcharge qui omet le paramètre « itérations » et appelle cette version avec des valeurs par défaut (comme 1000).

37voto

Mauricio Scheffer Points 70470

Voici ce que j’ai été en utilisant :

Utilisation :

12voto

Mark Ingram Points 24995

Vous pourriez essayer d'écrire une méthode d'extension pour quelle que soit la classe que vous utilisez (ou de toute classe de base).

J'aurais l'appel ressembler à:

Stopwatch sw = MyObject.TimedFor(1000, () => DoStuff(s));

Ensuite, la méthode d'extension:

public static Stopwatch TimedFor(this DependencyObject source, Int32 loops, Action action)
{
var sw = new Stopwatch();
sw.Start();
for (int i = 0; i < loops; ++i)
{
    action.Invoke();
}
sw.Stop();

return sw;
}

Tout objet provenant de DependencyObject pouvez maintenant appeler TimedFor(..). La fonction peut être facilement ajustée pour fournir les valeurs de retour via réf params.

--

Si vous ne voulez pas la fonctionnalité d'être lié à toute la classe / objet que vous pourriez faire quelque chose comme:

public class Timing
{
  public static Stopwatch TimedFor(Action action, Int32 loops)
  {
    var sw = new Stopwatch();
    sw.Start();
    for (int i = 0; i < loops; ++i)
    {
      action.Invoke();
    }
    sw.Stop();

    return sw;
  }
}

Ensuite, vous pouvez l'utiliser comme:

Stopwatch sw = Timing.TimedFor(() => DoStuff(s), 1000);

À défaut, cette réponse ressemble a une décente "générique" capacité:

Habillage de chronométrage avec un délégué ou lambda?

7voto

Mark S. Rasmussen Points 13313

J’ai écrit une classe simple de CodeProfiler il y a quelque temps encapsulée chronomètre pour facilement une méthode à l’aide d’une Action du profil : http://www.improve.dk/blog/2008/04/16/profiling-code-the-easy-way

Il vous permet aussi facilement profiler le code multithread. L’exemple suivant profilera le lambda de l’action à filetage 1-16 :

7voto

Anthony Mastrean Points 8582

L' StopWatch de la classe ne doit pas être Disposed ou Stopped sur erreur. Ainsi, le code le plus simple pour le temps certains d'action est

public partial class With
{
    public static long Benchmark(Action action)
    {
        var stopwatch = Stopwatch.StartNew();
        action();
        stopwatch.Stop();
        return stopwatch.ElapsedMilliseconds;
    }
}

Exemple de code d'appel

public void Execute(Action action)
{
    var time = With.Benchmark(action);
    log.DebugFormat("Did action in {0} ms.", time);
}

Je n'aime pas l'idée d'inclure les itérations dans l' StopWatch code. Vous pouvez toujours en créer une autre méthode ou une extension qui gère l'exécution d' N itérations.

public partial class With
{
    public static void Iterations(int n, Action action)
    {
        for(int count = 0; count < n; count++)
            action();
    }
}

Exemple de code d'appel

public void Execute(Action action, int n)
{
    var time = With.Benchmark(With.Iterations(n, action));
    log.DebugFormat("Did action {0} times in {1} ms.", n, time);
}

Voici la méthode d'extension versions

public static class Extensions
{
    public static long Benchmark(this Action action)
    {
        return With.Benchmark(action);
    }

    public static Action Iterations(this Action action, int n)
    {
        return () => With.Iterations(n, action);
    }
}

Et l'exemple de code d'appel

public void Execute(Action action, int n)
{
    var time = action.Iterations(n).Benchmark()
    log.DebugFormat("Did action {0} times in {1} ms.", n, time);
}

J'ai testé les méthodes statiques et les méthodes d'extension (combinaison d'itérations et de référence) et le delta de l'exécution attendu le temps réel et le temps d'exécution est <= 1 ms.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X