Действительно ли счетчики производительности являются правильным инструментом для моего задания? Если так, как я использую их?

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

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

Примечание: Я не ищу третье лицо профильное приложение, у меня должны быть память и данные ЦП, отображенные моим приложением.

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

7
задан Simon 9 March 2010 в 15:06
поделиться

5 ответов

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

1
ответ дан 7 December 2019 в 03:14
поделиться

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

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

Важная деталь для выявления узких мест.

CPU

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

память

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

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

0
ответ дан 7 December 2019 в 03:14
поделиться

Предполагая, что приложение с одним экземпляром для использования ЦП и памяти (рабочий набор процессов), вы можете сделать что-то вроде следующего:

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
ответ дан 7 December 2019 в 03:14
поделиться

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

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

Чтобы определить, сколько времени вы тратите на определенные функции, используйте профилировщик.


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

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

Есть довольно много примеров , которые могут облегчить вам задачу. Однако понимание архитектуры и «официальной» терминологии все же имеет смысл. Обычно действительно MS API требуют много читать и искать хороший код оболочки, это не значит, что они всегда болезненны.

3
ответ дан 7 December 2019 в 03:14
поделиться

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

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

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

2
ответ дан 7 December 2019 в 03:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: