8

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

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

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

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

编辑 2: Pastebin 已经过时了。现在在GitHub 存储库上

4

5 回答 5

16

最简单的选择可能是使用 a Queue<T>,因为它提供了您所追求的先进先出行为。只需Enqueue()你的项目,当你有超过 X 个项目时,Dequeue()额外的项目。

于 2010-06-22T20:36:28.743 回答
3

可能使用过滤器:

average = 0.9*average + 0.1*value 其中“value”是最近的测量值

随 0.9 和 0.1 变化(只要这两者之和为 1)

这不完全是一个平均值,但它确实过滤掉了尖峰、瞬变等,但不需要存储阵列。

问候,卡雷尔

于 2013-04-17T12:45:22.943 回答
1

如果您需要最快的实现,那么是的,具有单独计数的固定大小的数组 () 将是最快的。

于 2010-06-22T20:39:30.827 回答
0

你应该看看 Windows 内置的性能监控:D。

MSDN

如果您以前没有使用过该 API,您会觉得它有点不靠谱,但它快速、强大、可扩展,并且可以快速获得可用的结果。

于 2010-06-22T21:48:59.320 回答
0

我的实现:

class RoundRobinAverage
{
    int[] buffer;
    byte _size;
    byte _idx = 0;
    public RoundRobinAverage(byte size)
    {
        _size = size;
        buffer = new int[size];
    }

    public double Calc(int probeValue)
    {
        buffer[_idx++] = probeValue;
        if (_idx >= _size)
            _idx = 0;

        return buffer.Sum() / _size;
    }
}

用法:

private RoundRobinAverage avg = new RoundRobinAverage(10);\
...
var average = avg.Calc(123);
于 2017-06-02T10:20:34.530 回答