2012-10-27 9 views
11

Die CPU-Nutzungsquote für Hintergrundaufgaben in WinRT beträgt 1 Sekunde oder 2 Sekunden, wenn sie sich auf dem Sperrbildschirm befinden. Die Frage ist, wie diese CPU-Auslastung genau gemessen werden kann - ich würde gerne wissen, ob mein Code unter dieser 2-Sekunden-Quote läuft oder nicht? Ich denke, nur mit DateTime.Now vor und nach der Ausführung der Aufgabe ist nicht der richtige Ansatz.
Die MSDN-Artikel über Hintergrundaufgaben:
Supporting your app with background tasksWie präzise CPU-Auslastung in Hintergrundaufgaben messen?

+0

Ich würde auch vermuten, dass ein i5 mehr Code ausführen kann als ein ARM-basierter Prozessor ... Benötige ich also den langsamsten Prozessor, der getestet werden kann, wenn meine App nicht mehr als 2 Sek dauert? – GameScripting

+0

Gut, wenn das stimmt, haben wir viel weniger Rechenleistung für unsere Hintergrundarbeit auf Low-End-ARM-Tablets als auf Core-i7-übertakteten Desktops. –

+0

Sind Web-Mitarbeiter die gleichen wie Hintergrundaufgaben? Ich möchte Bilder holen und zwischenspeichern, aber 2 Sekunden scheinen nicht genug Bearbeitungszeit zu sein (besonders, da ich sie zuschneiden und speichern möchte). – kamranicus

Antwort

0

ich hatte das gleiche Problem.

Wenn Sie Task Manager starten, können Sie unter der Registerkarte App history die Statistiken der Ressourcennutzung durch verschiedene Apps sehen. Einer von ihnen ist CPU Time. Das Problem ist, dass es nicht der Durchschnitt ist, aber es zeigt nur die gesamte CPU-Nutzungszeit an.

Wenn Sie die durchschnittliche Zeit benötigen, besteht der Trick darin, in Ihrer App für jede Hintergrundaktivität zu zählen und die gesamte Zeit zu teilen, damit Sie eine durchschnittliche Zeit erhalten.

+0

Ich denke, das ist das Beste, was wir jetzt tun können, um die CPU-Auslastung zu messen, danke. –

0

Ich verwendete GetProcessTimes WinAPI.

Die Dokumentation sagt: „Desktop-Anwendungen nur“, aber technisch ist es vorhanden, auch auf den Telefonen:

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

Auf dem PC KERNELBASE.DLL mit Kernel32.dll ersetzen.

Das wird die Marktzertifizierung nicht bestehen, aber sollte ausreichen, um Ihre Hintergrundaufgabe zu benchmarken.

Rufen Sie GetProcessTimes beim Start auf, berechnen Sie long startTime = KernelTime + UserTime. Rufen Sie GetProcessTimes auf, wenn Sie fertig sind, berechnen Sie (KernelTime + UserTime) - startTime, und Sie erhalten Ihre Daten. Die Maßeinheit ist 100ns Ticks, genau wie in TimeSpan.