2012-10-27 7 views
11

La quota di utilizzo della CPU per le attività in background in WinRT è di 1 secondo o 2 secondi se sono bloccate. La domanda è come misurare con precisione questo utilizzo della CPU - Mi piacerebbe sapere se il mio codice gira sotto questa quota di 2 secondi o no? Immagino che usare solo DateTime.Ora prima e dopo l'esecuzione dell'attività non sia l'approccio giusto.
l'articolo di MSDN su Attività in background:
Supporting your app with background tasksCome misurare con precisione l'utilizzo della CPU nelle attività in background?

+0

Direi anche che un i5 può eseguire più codice di un processore basato su ARM ... Avrò così bisogno del processore più lento per testare se la mia app non impiegherà più di 2 secondi? – GameScripting

+0

Un buon punto, se è giusto, abbiamo molto meno potenza di calcolo per il nostro lavoro in background sui tablet ARM di fascia bassa rispetto ai desktop Oveclocked Core-i7. –

+0

I web worker sono gli stessi delle attività in background? Vorrei recuperare e memorizzare nella cache le immagini, ma 2 secondi non sembrano abbastanza tempo di elaborazione (soprattutto perché mi piacerebbe ritagliarli e salvarli). – kamranicus

risposta

0

Ho avuto lo stesso problema.

Se si avvia Task Manager, nella scheda App history, è possibile visualizzare le statistiche sull'utilizzo delle risorse da varie app. Uno di questi è CPU Time. Il problema è che non è la media, ma mostra solo il tempo totale di utilizzo della CPU.

Se hai bisogno del tempo medio, il trucco è di tenere un conteggio nella tua app per qualsiasi attività in background, e dividere tutto il tempo per quello, in modo da ottenere un tempo medio.

+0

Immagino che questo sia il meglio che possiamo fare adesso per misurare l'utilizzo della CPU, grazie. –

0

Ho utilizzato GetProcessTimes WinAPI.

La documentazione dice “desktop applicazioni solo”, ma tecnicamente, è presente anche sui telefoni:

[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); 

Sul PC sostituire KERNELBASE.DLL con Kernel32.dll.

Ciò non supererà la certificazione del marketplace, ma dovrebbe essere sufficiente per valutare l'attività in background.

Chiamare GetProcessTimes quando avviato, calcolare long startTime = KernelTime + UserTime. Chiama GetProcessTimes al termine, calcola (KernelTime + UserTime) - startTime e ottieni i tuoi dati. L'unità di misura è 100ns tick, proprio come in TimeSpan.

Problemi correlati