C#中的简单循环(移动平均)数组

Tom*_*ght 8 c# arrays performance diagnostics

作为诊断,我想在我的应用程序中显示每秒的周期数.(想想第一人称射击游戏中的每秒帧数.)

但我不想显示最近的值,或者自发布以来的平均值.我想要计算的是最后X值的平均值.

我想,我的问题是关于存储这些值的最佳方法.我的第一个想法是创建一个固定大小的数组,因此每个新值都会推出最老的数组.这是最好的方法吗?如果是这样,我将如何实现它?

编辑: 这是我写的课程:RRQueue.它继承了Queue,但强制执行容量并在必要时出列.

编辑2: Pastebin太过分了.现在在GitHub上回购.

Ree*_*sey 16

对此最简单的选择可能是使用a Queue<T>,因为这提供了您所追求的先进先出行为.Just Enqueue()你的物品,当你有超过X物品时,Dequeue()额外的物品.


Hen*_*man 13

一个简单但快速的实现:

// untested

int[] values = new int [10];  // all 0's initially
int sum = 0;
int pos = 0;

void AddValue (int v)
{
   sum -= values[pos];  // only need the array to subtract old value
   sum += v;
   values[pos] = v;     
   pos = (pos + 1) % values.length;    
}

int Average()
{
   return sum / values.length;
}
Run Code Online (Sandbox Code Playgroud)

  • _因为除法比乘法更昂贵_仅适用于简单/较旧的硬件。我会将所有这些微观优化留给编译器。 (2认同)