0

我有一个用于 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 做些什么来改变这一点吗?

4

4 回答 4

4

问题一:

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

问题2:

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

问题 3:

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

于 2009-09-15T18:49:35.343 回答
1

听起来您在长案件中受 IO 约束。你还在机器上做其他事情吗?CPU 本身并没有节流——它肯定在等待某些东西。

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

于 2009-09-15T18:46:32.697 回答
1

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

于 2009-09-15T18:48:10.993 回答
1

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

于 2009-09-15T18:49:40.007 回答