J'écris du code comme celui-ci, faisant un petit timing rapide et sale:
var sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 1000; i++)
{
b = DoStuff(s);
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
Il y a sûrement un moyen d'appeler ce morceau de code de synchronisation comme un lambda de fantaisie .NET 3.0 plutôt que (Dieu nous en préserve) de le couper et de le coller plusieurs fois et de le remplacer DoStuff(s)
par DoSomethingElse(s)
?
Je sais que cela peut être fait comme un Delegate
mais je m'interroge sur la manière lambda.
Time
se comporte comme une méthode statique, supprimant tout état existant danssw
, donc l'introduire en tant que méthode d'instance semble simplement gadget.Stopwatch.StartNew
, ce qui est statique pour une raison. C # n'a pas la possibilité d'ajouter des méthodes statiques aux classes existantes (contrairement à F #), donc je comprends l'impulsion de le faire, mais cela laisse toujours un mauvais goût dans ma bouche.Voici ce que j'utilise:
Usage:
la source
Console.WriteLine("")
pour tester sous// do stuff that I want to measure
, alors le compilateur n'est pas du tout content. Êtes-vous censé y faire des expressions et des déclarations normales?Vous pouvez essayer d'écrire une méthode d'extension pour la classe que vous utilisez (ou pour toute classe de base).
Je voudrais que l'appel ressemble à:
Puis la méthode d'extension:
Tout objet dérivant de DependencyObject peut désormais appeler TimedFor (..). La fonction peut être facilement ajustée pour fournir des valeurs de retour via les paramètres de référence.
-
Si vous ne voulez pas que la fonctionnalité soit liée à une classe / un objet, vous pouvez faire quelque chose comme:
Ensuite, vous pouvez l'utiliser comme:
À défaut, cette réponse semble avoir une capacité "générique" décente:
Emballage du chronométrage StopWatch avec un délégué ou un lambda?
la source
La
StopWatch
classe n'a pas besoin d'êtreDisposed
ouStopped
sur erreur. Ainsi, le code le plus simple pour chronométrer une action estExemple de code d'appel
Je n'aime pas l'idée d'inclure les itérations dans le
StopWatch
code. Vous pouvez toujours créer une autre méthode ou une extension qui gère l'exécution desN
itérations.Exemple de code d'appel
Voici les versions de la méthode d'extension
Et un exemple de code d'appel
J'ai testé les méthodes statiques et les méthodes d'extension (combinant itérations et benchmark) et le delta du temps d'exécution attendu et du temps réel d'exécution est <= 1 ms.
la source
J'ai écrit il y a quelque temps une simple classe CodeProfiler qui enveloppait Stopwatch pour profiler facilement une méthode à l'aide d'une action: http://www.improve.dk/blog/2008/04/16/profiling-code-the-easy-way
Cela vous permettra également de profiler facilement le code multithread. L'exemple suivant profilera l'action lambda avec 1 à 16 threads:
la source
En supposant que vous ayez juste besoin d'un timing rapide pour une chose, c'est facile à utiliser.
la source
Vous pouvez surcharger un certain nombre de méthodes pour couvrir divers cas de paramètres que vous voudrez peut-être passer au lambda:
Vous pouvez également utiliser le délégué Func s'ils doivent renvoyer une valeur. Vous pouvez également transmettre un tableau (ou plus) de paramètres si chaque itération doit utiliser une valeur unique.
la source
Pour moi, l'extension semble un peu plus intuitive sur int, vous n'avez plus besoin d'instancier un chronomètre ou de vous soucier de le réinitialiser.
Donc vous avez:
Avec l'exemple d'utilisation de:
Exemple de sortie:
la source
J'aime utiliser les classes CodeTimer de Vance Morrison (l'un des mecs de performance de .NET).
Il a publié un article sur son blog intitulé " Mesurer le code managé rapidement et facilement: CodeTimers ".
Il comprend des trucs sympas tels qu'un MultiSampleCodeTimer. Il effectue un calcul automatique de la moyenne et de l'écart type et il est également très facile d'imprimer vos résultats.
la source
la source