Как правильно использовать Счетчик производительности или Класс процесса в C #, чтобы получить использование памяти текущего процесса? - PullRequest
8 голосов
/ 23 января 2012

Согласно Как использовать .NET PerformanceCounter для отслеживания использования памяти и ЦП для процесса? PerformanceCounter должно дать мне количество использованной памяти для данного процесса.

Согласно MSDN , Process экземпляр также может дать мне более или менее тот же номер.

Чтобы проверить свои предположения, я написал следующий код:

class Program
{
    static Process process = Process.GetCurrentProcess();

    static PerformanceCounter privateBytesCounter = new PerformanceCounter("Process", "Private Bytes", process.ProcessName);
    static PerformanceCounter workingSetCounter = new PerformanceCounter("Process", "Working Set", process.ProcessName);

    static void Main(string[] args)
    {


        GetMeasure();

        Console.WriteLine("\nPress enter to allocate great amount of memory");
        Console.ReadLine();
        int[] arr = new int[10000000];
        for (int i = 0; i < arr.Length; i++)
        {
            arr[i] = i;
        }

        GetMeasure();

        privateBytesCounter.Dispose();
        workingSetCounter.Dispose();
        Console.ReadKey();
    }

    private static void GetMeasure()
    {
        Console.WriteLine("{0,38} {1,20}", "Private bytes", "working set");
        Console.WriteLine("process data{0,23} {1,20}", process.PrivateMemorySize64 / 1024, process.WorkingSet64 / 1024);
        Console.WriteLine("PerformanceCounter data{0,12} {1,20}", privateBytesCounter.NextValue() / 1024, workingSetCounter.NextValue() / 1024);
    }

}

Вывод выглядит как

                         Private bytes          working set
process data                  22880                17516
PerformanceCounter data       21608                15608

Press enter to allocate great amount of memory

                         Private bytes          working set
process data                  22880                17516
PerformanceCounter data       21608                15608

Точно так же!Напротив, количество приватных байтов, отображаемых в Process Explorer, увеличилось с 32732 до 63620.

Так я что-то не так делаю?

Ответы [ 2 ]

9 голосов
/ 23 января 2012

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

private static void GetMeasure()
{
    process.Refresh();  // Updates process information

    Console.WriteLine("{0,38} {1,20}", "Private bytes", "working set");
    Console.WriteLine("process data{0,23} {1,20}", process.PrivateMemorySize64 / 1024, process.WorkingSet64 / 1024);
    Console.WriteLine("PerformanceCounter data{0,12} {1,20}", privateBytesCounter.NextValue() / 1024, workingSetCounter.NextValue() / 1024);
}

Это для твоего process. Для счетчиков производительности NextValue() должен каждый раз получать новые свежие данные, поэтому я не могу объяснить, почему их нет на вашем компьютере. По моему работает нормально.

EDIT

С добавлением process.Refresh() вот что я получаю:

                         Private bytes          working set
process data                  25596                22932
PerformanceCounter data       26172                23600

Press enter to allocate great amount of memory
                         Private bytes          working set
process data                  65704                61848
PerformanceCounter data       65828                61880
4 голосов
/ 29 февраля 2012

Внимание: мой профилировщик памяти (.NET Memory Profiler) обнаружил, что Process.Refresh () выделяет значительный кусок памяти на временной основе, так что имейте это в виду, если вы регулярно читаете свои счетчики производительностииспользуя таймер

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