Являются ли счетчики производительности подходящим инструментом для моей работы? Если так, как я могу их использовать? - PullRequest
7 голосов
/ 09 марта 2010

Меня спросили, как узнать, сколько памяти и ЦП использует моя программа, и меня отослали к счетчикам производительности. Однако, когда я смотрю на документацию, она начинается с того, что рассказывает мне о предоставлении данных о потребителе, создавая манифест для моего приложения, и мои глаза остекленяют. Приятно, что такой универсальный инструмент есть, я полагаю, но все, что мне нужно, это набор функций, которые бы сообщали мне, сколько памяти и процессора использует моя программа.

Являются ли счетчики производительности подходящим инструментом для моей работы? Если так, как я могу их использовать? Я действительно не хочу ничего устанавливать вне моего приложения на C #.

ПРИМЕЧАНИЕ. Я не ищу стороннее приложение для профилирования, мне нужно, чтобы данные моего приложения отображали память и процессор.

ОБНОВЛЕНИЕ: Я удалил время в функциях, поскольку это, казалось, запутало вопрос.

Ответы [ 5 ]

3 голосов
/ 09 марта 2010

Предполагая одно приложение для использования процессора и памяти (Process Working Set), вы можете сделать что-то вроде следующего:

public static void Main(string[] args)
{
    string processName = Process.GetCurrentProcess().ProcessName;
    int processorCount = Environment.ProcessorCount;

    // Simulate process usage
    for (int i = 0; i < processorCount * 2; i++)
    {
        var t = new Thread(() =>
            {
                while (true) { Console.WriteLine("Busy..."); }
            });

        t.IsBackground = true;
        t.Start();
    }

    var cpu = new PerformanceCounter("Process", "% Processor Time");
    cpu.InstanceName = processName;
    cpu.NextValue();

    var ram = new PerformanceCounter("Process", "Working Set");
    ram.InstanceName = processName;

    float memUsage = (ram.NextValue() / 1024) / 1024;
    Console.WriteLine("Memory Usage: {0}MB", memUsage);

    float cpuUsage = cpu.NextValue() / (float)processorCount;
    Console.WriteLine("CPU Usage: {0}%", cpuUsage);
}

Для счетчика производительности использования ЦП первый вызов NextValue возвращает 0, поэтому для отображения значения используется только второй вызов. Заявленное использование является суммой для всех процессоров машины, поэтому среднее значение вычисляется перед отображением.

3 голосов
/ 09 марта 2010

Вы можете использовать perfmon из коробки для мониторинга использования процессора, памяти и диска, а также многих специфических счетчиков производительности .NET. perfmon поставляется с windows.

Глазное стекло требуется только в том случае, если вы хотите написать свой собственный perfmon или если вы хотите предложить свои собственные счетчики производительности. Последнее было бы интересно, только если ваши пользователи должны будут отслеживать это значение (например, вы разрабатываете серверное приложение, и ваши пользователи должны убедиться, что не более 10% соединений отклонено из-за неправильной фазы луны).

Для определения того, сколько времени вы проводите в определенных функциях, используйте профилировщик.


API Performance Counter позволит вам отслеживать данные вместе с существующими счетчиками производительности (которые могут сказать вам, например, что функция Foo работает очень медленно каждую ночь после 11, потому что какой-то другой процесс перебивает диск), и монитор может работать как служба и создавать файлы журналов для последующего анализа.

Вы должны выяснить, стоят ли эти преимущества дополнительных проблем со счетчиками производительности, или вам лучше использовать систему ведения журналов.

Существует довольно много примеров , которые могут помочь вам. Тем не менее, все еще стоит понимать архитектуру и «официальную» терминологию. Как правило, MS 101 do требует много чтения и поиска хорошего кода-обертки, но это не значит, что они всегда болезненны.

2 голосов
/ 09 марта 2010

Чтобы получить простую информацию, взгляните на эти значения в коде C #, а затем выберите то, что наиболее актуально для вас:

System.Diagnostics.Process.GetCurrentProcess().TotalProcessorTime
System.Diagnostics.Process.GetCurrentProcess().PrivateMemorySize64
System.Diagnostics.Process.GetCurrentProcess().VirtualMemorySize64
System.GC.GetTotalMemory(false)

PrivateMemorySize - это общее количество личных байтов (управляемых и неуправляемых вместе) для вашего процесса. GetTotalMemory дает вам общее использование управляемой памяти для вашего приложения, передача true заставит GC получить значение.

1 голос
/ 09 марта 2010

Счетчики производительности не скажут вам, сколько времени ваше приложение тратит на функцию. Для этого вы можете использовать какой-то класс таймера, который вы начинаете в начале функции и заканчиваете в конце.

0 голосов
/ 09 марта 2010

сколько времени тратит на функцию

Для этого вам нужен профилировщик (например, тот, который включен в более продвинутые выпуски Visual Studio). Это даст вам подробную информацию о том, сколько раз вызывается каждый метод (с функциями или без функций, которые он вызывает).

Основные детали для выявления узких мест.

CPU

Общее количество счетчиков производительности процессорных секунд (или столбцов в диспетчере задач или в проводнике процессов) даст вам это. На практике вам может потребоваться более подробная информация (время ядра или пользователь), которая также доступна.

память

Это сложная часть .... «память» может означать: выделенное виртуальное адресное пространство, выделенное виртуальное адресное пространство, рабочий набор, пиковый рабочий набор, личная память, ...

Вам, вероятно, нужно провести некоторое время с внутренними компонентами Windows или подобными ссылками, чтобы понять, чем они отличаются и что они значат, прежде чем приступать к реальному анализу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...