Как точно измерять использование ЦП в фоновых задачах?

Квота использования ЦП для фоновых задач в WinRT составляет 1 секунду или 2 секунды, если они находятся на заблокированном экране. Вопрос в том, как точно измерить это использование ЦП - я хотел бы знать, работает ли мой код под этой 2-секундной квотой или нет? Я думаю, используя только DateTime.Now до и после выполнения задачи не является правильным подходом.
Статья MSDN о фоновых задачах:
Поддержка вашего приложения с помощью фоновых задач

Ответ 1

У меня была та же проблема.

Если вы запустите Task Manager, под вкладкой App history вы увидите статистику использования ресурсов различными приложениями. Один из них CPU Time. Проблема в том, что она не средняя, ​​но она отображает общее время использования процессора.

Если вам нужно среднее время, трюк состоит в том, чтобы сохранить счет в приложении для любой фоновой активности и делить на это все время, поэтому вы получите среднее время.

Ответ 2

Я использовал GetProcessTimes WinAPI.

В документации упоминаются только "настольные приложения", но технически они присутствуют даже на телефонах:

    [DllImport( "KERNELBASE.DLL", SetLastError = true )]
    static extern IntPtr GetCurrentProcess();

    // NB! Undocumented API, won't pass marketplace checks.
    [DllImport( "KERNELBASE.DLL", SetLastError = true )]
    [return: MarshalAs( UnmanagedType.Bool )]
    static extern bool GetProcessTimes( IntPtr hProcess, out long lpCreationTime, out long lpExitTime, out long lpKernelTime, out long lpUserTime );

На ПК замените KERNELBASE.DLL на Kernel32.dll.

Это не пройдет сертификацию на рынке, но вам должно быть достаточно, чтобы сравнить ваши фоновые задачи.

Вызвать GetProcessTimes при запуске, рассчитать long startTime = KernelTime + UserTime. Вызовите GetProcessTimes, когда закончите, вычислите ( KernelTime + UserTime ) - startTime, и вы получите свои данные. Единица измерения - 100 нс, как и в TimeSpan.