Habillage de chronométrage avec un délégué ou lambda?
Je suis en train d'écrire un code comme ça, en faisant un peu rapide et sale timing:
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 certainement un moyen d'appeler ce morceau de code de timing comme une fantaisie schmancy .NET 3.0 lambda plutôt que (à Dieu ne plaise) de découpage et de collage à quelques reprises et le remplacement de la DoStuff(s)
avec DoSomethingElse(s)
?
Je sais que cela peut être fait comme une Delegate
mais je m'interroge sur le lambda moyen.
Vous devez vous connecter pour publier un commentaire.
Comment sur l'extension du Chronomètre classe?
Puis l'appeler comme ceci:
Vous pouvez ajouter une autre surcharge qui omet le "itérations" des paramètres et des appels cette version avec une certaine valeur par défaut (genre 1000).
StartNew()
méthode, mais peut-être VVS moyen de remplacer lesw.Reset(); sw.Start();
avecsw.Restart();
? Sonne comme une question de préférence pour moi.Time
se comporte comme une méthode statique, en éliminant tout état existant danssw
, afin de la présenter comme une méthode d'instance semble tout à fait fantaisistes.Stopwatch.StartNew
, qui est statique pour une raison. C# n'a pas la capacité d'ajouter des méthodes statiques de classes existantes (à la différence de F#), donc je comprends l'impulsion pour ce faire, mais il laisse toujours un mauvais goût dans ma bouche.Voici ce que j'ai été en utilisant:
Utilisation:
Console.WriteLine("")
pour le test dans// do stuff that I want to measure
, alors le compilateur n'est pas heureux du tout. Êtes-vous censé faire des expressions et des déclarations là-bas?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 à:
Ensuite la méthode d'extension:
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:
Ensuite, vous pouvez l'utiliser comme:
À 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?
La
StopWatch
classe n'a pas besoin d'êtreDisposed
ouStopped
en cas d'erreur. Ainsi, le code le plus simple pour temps certains 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 en créer une autre méthode ou une extension qui gère l'exécution deN
itérations.Exemple de code d'appel
Voici la méthode d'extension versions
Et exemple de code d'appel
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.
J'ai écrit un simple CodeProfiler classe il y a quelques temps qui a enveloppé le Chronomètre de facilement profil d'une méthode utilisant une des actions suivantes:
http://www.improve.dk/blog/2008/04/16/profiling-code-the-easy-way
Il va également facilement vous permettre de profil le code multithread. L'exemple suivant le profil de l'action lambda avec 1-16 threads:
En supposant que vous avez juste besoin d'un moyen rapide de timing d'une chose c'est facile à utiliser.
Vous pouvez surcharger un certain nombre de méthodes pour couvrir les différents cas de paramètres que vous pourriez vouloir passer pour le lambda:
Alternativement, vous pouvez utiliser le délégué Func si elle doit retourner une valeur. Vous pouvez également passer dans un tableau (ou plus) de paramètres si chaque itération doit utiliser une valeur unique.
Pour moi l'extension se sent un peu plus intuitive sur int, vous n'avez plus besoin d'instancier un Chronomètre ou de se soucier de le réinitialiser.
De façon à avoir:
Avec l'exemple de l'utilisation de:
Exemple de sortie:
J'aime utiliser les CodeTimer classes de Vance Morrison (l'une de la performance mecs de .NET).
Il a fait un post sur son blog intitulé "La mesure de code géré rapidement et easiliy: CodeTimers".
Il comprend des trucs cool comme un MultiSampleCodeTimer. Il n'calcul automatique de la moyenne et de l'écart type, et il est aussi très facile à imprimer vos résultats.