Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Simple round robin (moving average) array in C#

As a diagnostic, I want to display the number of cycles per second in my app. (Think frames-per-second in a first-person-shooter.)

But I don't want to display the most recent value, or the average since launch. What I want to calculate is the mean of the last X values.

My question is, I suppose, about the best way to store these values. My first thought was to create a fixed size array, so each new value would push out the oldest. Is this the best way to do it? If so, how would I implement it?

EDIT: Here's the class I wrote: RRQueue. It inherits Queue, but enforces the capacity and dequeues if necessary.

EDIT 2: Pastebin is so passé. Now on a GitHub repo.

like image 890
Tom Wright Avatar asked Jun 22 '10 20:06

Tom Wright


3 Answers

The easiest option for this is probably to use a Queue<T>, as this provides the first-in, first-out behavior you're after. Just Enqueue() your items, and when you have more than X items, Dequeue() the extra item(s).

like image 124
Reed Copsey Avatar answered Nov 13 '22 02:11

Reed Copsey


Possibly use a filter:

average = 0.9*average + 0.1*value where 'value' is the most recent measurement

Vary with the 0.9 and 0.1 (as long as the sum of these two is 1)

This is not exactly an average, but it does filter out spikes, transients, etc, but does not require arrays for storage.

Greetings, Karel

like image 3
Karel Avatar answered Nov 13 '22 02:11

Karel


If you need the fastest implementation, then yes, a fixed-size array ()with a separate count would be fastest.

like image 1
Stephen Cleary Avatar answered Nov 13 '22 04:11

Stephen Cleary