【问题标题】:How to measure precisely CPU usage in Background Tasks?如何精确测量后台任务中的 CPU 使用率?
【发布时间】:2012-10-27 20:10:51
【问题描述】:

WinRT 中后台任务的 CPU 使用配额为 1 秒,如果它们处于锁屏状态,则为 2 秒。问题是如何准确测量这个 CPU 使用率 - 我想知道我的代码是否在这 2 秒的配额下运行?我猜在执行任务之前和之后只使用 DateTime.Now 不是正确的方法。
关于后台任务的 MSDN 文章:
Supporting your app with background tasks

【问题讨论】:

  • 我也猜想 i5 可以运行比基于 ARM 的处理器更多的代码......我是否需要最慢的处理器来测试我的应用程序是否不会超过 2 秒?跨度>
  • 好点子,如果这是对的,我们在低端 ARM 平板电脑上进行后台工作的计算能力比在 Core-i7 超频台式机上要少得多。
  • 网络工作者和后台任务一样吗?我想获取和缓存图像,但 2 秒似乎不够处理时间(尤其是因为我想裁剪并保存它们)。
  • 这是一次任务还是会重复运行?

标签: windows-8 microsoft-metro windows-runtime


【解决方案1】:

我遇到了同样的问题。

如果你启动Task Manager,在App history标签下,你可以看到各个应用的资源使用统计。其中之一是CPU Time。问题是它不是平均值,而是只显示总CPU使用时间。

如果您需要平均时间,诀窍是在您的应用中记录所有后台活动的计数,然后将整个时间除以该平均时间。

【讨论】:

  • 我想这是我们现在可以做的最好的测量 CPU 使用率的方法,谢谢。
【解决方案2】:

我使用GetProcessTimesWinAPI。

文档说“仅限桌面应用”,但从技术上讲,它甚至存在于手机上:

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

在 PC 上将 KERNELBASE.DLL 替换为 Kernel32.dll。

这不会通过市场认证,但应该足以让您对后台任务进行基准测试。

启动时调用GetProcessTimes,计算long startTime = KernelTime + UserTime。完成后调用GetProcessTimes,计算( KernelTime + UserTime ) - startTime,然后你就得到了你的数据。度量单位是 100ns 滴答声,就像在 TimeSpan 中一样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 2015-03-24
    • 1970-01-01
    • 2016-04-22
    • 1970-01-01
    • 2012-07-15
    • 1970-01-01
    相关资源
    最近更新 更多