【问题标题】:Getting CPU time in OS X在 OS X 中获取 CPU 时间
【发布时间】:2024-04-17 19:15:01
【问题描述】:

我有一个用于 OS X 的 Objective-c 应用程序,它比较两个 sqlite DB 并生成 json 格式的差异。数据库非常大(10,000 个项目,包含许多字段)。有时这个应用程序运行大约 55 秒(使用 95% 的 cpu)。有时大约需要 8 分钟(使用 12% 的 cpu)。这是相同的数据库。当它只使用一小部分 cpu 时,其余部分可用。似乎没有任何事情优先于该过程。在命令上添加“nice -20”似乎可以确保我得到 cpu 使用率。我的问题是

  1. 如果没有其他东西在使用 cpu 为什么 我的应用程序没有利用 是吗?

  2. 有什么我可以做的吗 以编程方式改变这一点?

  3. 我可以对 OS X 做些什么来 改变这个?

【问题讨论】:

  • 数据库文件有多大?您的进度的内存消耗情况如何(虚拟大小、驻留大小、查看顶部的输出)?

标签: c objective-c macos process cpu-usage


【解决方案1】:

问题 1:

由于我假设您必须从磁盘读取数据库,因此您没有充分利用 CPU,因为您的代码阻塞了磁盘读取。在 Mac OS X 上,有很多东西在后台运行,它们不会占用大量 CPU 时间,但会发出大量磁盘读取,例如 Spotlight。

问题 2:

可能不会,除了尽可能最有效地利用磁盘访问。

问题 3:

关闭正在访问磁盘的任何其他进程。这包括许多你真的不应该关闭的系统进程,所以我认为你可以在这里做很多事情,除了尝试在没有所有 Mac OS X 的情况下在 Darwin 上运行它。

【讨论】:

  • 另一种可能性:您将数据库拉入内存,并且在您访问它时分页和分页,因为还有其他需要内存的东西正在运行。当没有其他东西使用内存并且整个数据库适合内存时,您可以快速运行。这完全取决于您的代码来读取数据库。
【解决方案2】:

听起来您在长案件中受 IO 限制。你还在机器上做其他事情吗? CPU 本身并没有节流——它肯定在等待什么。

您可以使用一些开发人员工具在您的应用程序运行时查看它——也许最有用的是“Instruments”,它是 dtrace 之上的 GUI。如果您正在运行最新的 Xcode,则应该安装它。您还可以使用 Shark,乍一看更容易使用,但从长远来看,它的信息量较少。

【讨论】:

  • 我完全不同意关于鲨鱼的评论。 Shark 在我看来是迄今为止衡量系统性能的最佳工具,尤其是跟踪系统调用、页面错误等。而且,与 Instruments 不同,它在采样时显示正确的线程状态。
  • 也许吧,但乔不想要“系统性能”,至少如果我能正确判断问题的话。他想要的是应用程序表征,这最好通过 Instruments 获得。另一方面,我对问题的判断可能完全错误。
【解决方案3】:

通常您可以获得所有可用的性能。如果 CPU 不是 100%,则有东西阻塞了它。在数据库的情况下,它通常是锁定的。使用 Shark 了解您的应用程序中发生了什么。

【讨论】:

    【解决方案4】:

    当你的程序使用很少的 CPU 时,可能是因为它正在等待磁盘,尤其是当其他进程同时访问磁盘时。另一种可能是您的程序使用了太多内存,而操作系统开始使用交换空间。

    【讨论】: