【问题标题】:Simple round robin (moving average) array in C#C# 中的简单循环(移动平均)数组
【发布时间】:2011-03-07 00:44:34
【问题描述】:

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

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

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

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

编辑 2: 巴斯宾太过时了。现在在a GitHub repo

【问题讨论】:

    标签: c# performance arrays diagnostics


    【解决方案1】:

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

    【讨论】:

    • 我是否必须复制到一个数组才能获得所有值的平均值?
    • @Tom:不,.NET 通用队列实现了IEnumerable<T>,所以你可以枚举元素来计算你的平均值。
    • 如果您使用的是 .NET 4.0(可能是 3.5),您应该能够直接在队列上调用 .Sum<T>().Count<T>() 扩展方法。如果你经常使用这个成语,自己创建一个.Average<T>()扩展方法是小菜一碟。
    • @drharris:大多数类型都有一个 Average() LINQ 方法。直接调用即可:msdn.microsoft.com/en-us/library/…
    • @Tom:就这样吧:双倍平均 = myQueue.Average(); // 如果你使用队列
    【解决方案2】:

    可能使用过滤器:

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

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

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

    您好, 卡雷尔

    【讨论】:

    • 对于不需要形式数学正确性而是所需平滑行为的应用程序,这个想法肯定值得一看!
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      MSDN

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

      【讨论】:

      • 谢谢亚伦。看起来很有趣,但对于我需要的东西来说可能有点矫枉过正。
      【解决方案5】:

      我的实现:

      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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-29
        • 1970-01-01
        • 2014-03-17
        • 2010-09-07
        相关资源
        最近更新 更多