Пользовательский счетчик производительности / минута в .NET - PullRequest
1 голос
/ 15 июня 2009

Я пытаюсь создать пользовательский счетчик производительности в C # на основе в минуту.

Пока что я видел только RateOfCountsPerSecond32 или RateOfCountsPerSecond64.

Кто-нибудь знает, каковы варианты создания пользовательского счетчика, основанного на поминутной минуте?

Ответы [ 2 ]

3 голосов
/ 27 июня 2009

Это не будет напрямую поддерживаться. Вам придется самостоятельно вычислять скорость в минуту, а затем использовать счетчик NumberOfItems32 или NumberOfItems64 для отображения скорости. Использование полезного имени, такого как «Счет / минута», прояснит, каково значение. Вы будете просто обновлять счетчик каждую минуту. Фоновый (рабочий) поток был бы хорошим местом для этого.

С другой стороны, вы можете зависеть от программного обеспечения для мониторинга. Используйте счетчик NumberOfItems32 / 64, но программное обеспечение для мониторинга должно выполнять поминутные вычисления. Средство PerfMon, встроенное в Windows, этого не делает, но нет никаких причин, по которым оно не могло.

2 голосов
/ 04 ноября 2015

По умолчанию 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());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...