comme diagnostic, je souhaite afficher le nombre de cycles par seconde dans mon application. (Pensez des cadres par seconde dans un tireur de premier-personne.) P>
Mais je ne veux pas afficher la valeur la plus récente, ni la moyenne depuis le lancement. Ce que je veux calculer, c'est la moyenne des dernières valeurs x. P>
Ma question est que je suppose, je suppose que la meilleure façon de stocker ces valeurs. Ma première pensée était de créer une matrice de taille fixe, chaque nouvelle valeur pousserait la plus ancienne. Est-ce la meilleure façon de le faire? Si oui, comment puis-je le mettre en œuvre? P>
EDIT: strong>
Voici la classe I écrue: RRQUEUE . Il hérite de la file d'attente, mais applique la capacité et les détresements si nécessaire. P>
edit 2: strong>
Pastebin est si PASSÉ. Maintenant, sur un repo github . P>
5 Réponses :
L'option la plus simple pour cela est probablement d'utiliser un Queue
, car cela fournit le comportement premier dans le premier en premier. Juste Enqueue () Vos articles et quand vous avez plus de x articles , Dequue () Le (s) article (s) supplémentaire (s). P>
Aurais-je à copier sur un tableau pour obtenir la moyenne de toutes les valeurs?
@TOM: Non, la file d'attente générique .NET est implémente ienumerable
Si vous utilisez .NET 4.0 (éventuellement 3.5), vous devriez pouvoir simplement appeler le .sum
.Count
.Avoir
@drHarris: la méthode moyenne <> () LINQ est une méthode moyenne de la plupart des types. Appelez-le directement:
@Tom: juste faire: double moyenne = myQueue.avery (); // Si vous utilisez la file d'attente
Mon mauvais sur ça. Pour une raison quelconque, la moyenne ne se présente pas dans mon intellisense mais me permet de l'utiliser sans erreur. Maintenant c'est un nouveau.
@DRHARRIS: Il n'est pas implémenté pour iEnumerable
Si vous avez besoin de la mise en œuvre la plus rapide, alors oui, une matrice de taille fixe () avec un compte séparé serait la plus rapide. P>
Vous devez jeter un oeil à la surveillance des performances intégrée à Windows: ré. p>
MSDN P>
L'API se sentira un peu bonsky si vous ne l'avez pas joué auparavant, mais c'est rapide, puissant, extensible et il fait un travail rapide d'obtenir des résultats utilisables. P>
Merci Aaron. On a l'air intéressant, mais peut-être surkill pour ce dont j'ai besoin.
Utilisez éventuellement un filtre: p>
moyenne = 0,9 * moyenne + 0,1 * valeur où 'valeur' est la mesure la plus récente p>
varie avec le 0,9 et 0,1 (tant que la somme de ces deux est 1) p>
Ce n'est pas exactement une moyenne, mais cela filtre les pointes, les transitoires, etc., mais ne nécessite pas de réseaux pour le stockage. P>
salutations, Karel P>
Pour les applications où l'exactitude mathématique formelle n'est pas nécessaire, mais plutôt un comportement de lissage souhaité, cette idée est sûre de jeter un coup d'œil!
Ma mise en œuvre:
private RoundRobinAverage avg = new RoundRobinAverage(10);\ ... var average = avg.Calc(123);