我有一个针对OS X的objective-c应用程序,它比较两个sqlite DB并生成json格式的diff。数据库非常大(10,000个项目,包含许多字段)。有时这个应用程序运行大约55秒(使用95%的CPU)。有时需要大约8分钟(使用12%的CPU)。这与DB相同。当它只使用cpu的一小部分时,其余部分可用。似乎没有任何优先于该过程的东西。在命令中添加“nice -20”似乎可以确保我获得cpu使用率。我的问题是
如果没有其他的使用cpu为什么 我的应用程序没有利用 它
我能做些什么吗? 以编程方式改变这个?
我可以对OS X做些什么 改变这个?
答案 0 :(得分:4)
问题1:
因为,我认为,您必须从磁盘读取数据库,因为您的代码在磁盘读取时阻塞,所以您没有充分利用CPU。在Mac OS X上,有很多东西在后台运行,不会占用大量的CPU时间,但会发送大量的磁盘读取,比如Spotlight。
问题2:
可能不是,除了尽可能最有效地使用磁盘访问之外。
问题3:
关闭正在访问磁盘的任何其他进程。这包括许多你真的不应该关闭的系统进程,所以我认为除了尝试在Darwin上运行它而没有Mac OS X的所有功能之外,你可以做的很多。
答案 1 :(得分:1)
听起来好像你在长时间内受到IO限制。你在机器上做了什么吗? CPU不会限制自己 - 它肯定在等待什么。
您可以使用一些开发人员工具在应用程序运行时查看它 - 也许最有用的是“Instruments”,它是dtrace之上的GUI。如果您正在运行最新的Xcode,则应该安装此选项。您也可以使用鲨鱼,乍一看更容易使用,但从长远来看信息量较少。
答案 2 :(得分:1)
通常您可以获得所有可用的性能。如果CPU不是100%,那就会阻塞它。在数据库的情况下,它经常锁定。使用Shark了解您的应用程序中发生了什么。
答案 3 :(得分:1)
当你的程序使用很少的CPU时,可能是因为它正在等待磁盘,特别是当其他进程同时访问磁盘时。另一种可能性是你的程序使用了太多内存,操作系统开始使用交换空间。