Квота использования ЦП для фоновых задач в 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.