2

我正在尝试在 C# 中基于每分钟创建一个自定义性能计数器。

到目前为止,我只看到了 RateOfCountsPerSecond32 或 RateOfCountsPerSecond64 可用。

有谁知道基于每分钟创建自定义计数器的选项是什么?

4

2 回答 2

3

这不会被直接支持。您必须自己计算每分钟的速率,然后使用 NumberOfItems32 或 NumberOfItems64 计数器来显示速率。使用“计数/分钟”之类的有用名称可以清楚地说明值是什么。您只需每分钟更新一次计数器。后台(工作者)线程将是这样做的好地方。

或者,您可以只依赖监控软件。使用 NumberOfItems32/64 计数器,但让监控软件进行每分钟计算。Windows 中内置的 PerfMon 工具不能做到这一点,但它没有理由不能做到。

于 2009-06-27T00:50:46.260 回答
2

默认情况下,PerfMon 每秒提取一次数据。为了在 Windows 性能监视器图表中获得永久图像,我编写了自定义计数器来测量每分钟计数率。工作一分钟后,我从计数器接收数据。请注意,准确性对我来说并不重要。

代码片段如下所示:

class PerMinExample
{
    private static PerformanceCounter _pcPerSec;
    private static PerformanceCounter _pcPerMin;
    private static Timer _timer = new Timer(CallBack, null, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1));
    private static Queue<CounterSample> _queue = new Queue<CounterSample>();

    static PerMinExample()
    {
        // RateOfCountsPerSecond32
        _pcPerSec = new PerformanceCounter("Category", "ORDERS PER SECOND", false);

        // NumberOfItems32
        _pcPerMin = new PerformanceCounter("Category", "ORDERS PER MINUTE", false);
        _pcPerSec.RawValue = 0;
        _pcPerMin.RawValue = 0;
    }

    public void CountSomething()
    {
        _pcPerSec.Increment();
    }

    private static void CallBack(Object o)
    {
        CounterSample sample = _pcPerSec.NextSample();

        _queue.Enqueue(sample);
        if (_queue.Count <= 60)
            return;

        CounterSample prev = _queue.Dequeue();

        Single numerator = (Single)sample.RawValue - (Single)prev.RawValue;
        Single denomenator = 
            (Single)(sample.TimeStamp - prev.TimeStamp) 
            / (Single)(sample.SystemFrequency) / 60;
        Single counterValue = numerator / denomenator;

        _pcPerMin.RawValue = (Int32)Math.Ceiling(counterValue);

        Console.WriteLine("ORDERS PER SEC: {0}", _pcPerSec.NextValue());
        Console.WriteLine("ORDERS PER MINUTE: {0}", _pcPerMin.NextValue());
    }
}
于 2015-11-04T13:18:14.140 回答