.NET中的自定义性能计数器/分钟

时间:2009-06-15 09:42:48

标签: performancecounter

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

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

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

2 个答案:

答案 0 :(得分:3)

不会直接支持此功能。您必须自己计算每分钟的速率,然后使用NumberOfItems32或NumberOfItems64计数器来显示速率。使用诸如“计数/分钟”之类的有用名称将清楚地表明该值是什么。你每分钟都会更新一次。背景(工人)线程是一个很好的地方。

或者,您可以依赖监控软件。使用NumberOfItems32 / 64计数器,但让监控软件按分钟计算。 Windows内置的PerfMon工具不会这样做,但没有理由不这样做。

答案 1 :(得分: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());
    }
}