在OSX中获取CPU时间

在OSX中获取CPU时间,c,objective-c,macos,process,cpu-usage,C,Objective C,Macos,Process,Cpu Usage,我有一个针对OSX的objective-c应用程序,它比较两个sqlite数据库并生成json格式的差异。数据库相当大(10000项,包含多个字段)。有时,此应用程序的运行时间约为55秒(使用95%的cpu)。有时大约需要8分钟(使用12%的cpu)。这是同一个数据库。当它只使用一小部分cpu时,其余部分可用。似乎没有任何东西优先于这一进程。在命令中添加“nice-20”似乎可以确保获得cpu使用率。我的问题是 如果没有其他东西在使用cpu,为什么 我的应用程序没有利用 是吗 有什么我能做的吗

我有一个针对OSX的objective-c应用程序,它比较两个sqlite数据库并生成json格式的差异。数据库相当大(10000项,包含多个字段)。有时,此应用程序的运行时间约为55秒(使用95%的cpu)。有时大约需要8分钟(使用12%的cpu)。这是同一个数据库。当它只使用一小部分cpu时,其余部分可用。似乎没有任何东西优先于这一进程。在命令中添加“nice-20”似乎可以确保获得cpu使用率。我的问题是

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

  • 有什么我能做的吗 通过编程来改变这一点

  • 我能为OSX做些什么吗 改变这个


  • 听起来你好像被长箱子束缚住了。你还在机器上做什么?CPU不是在自我调节——它肯定在等待什么


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

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

    问题1:

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

    问题2:

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

    问题3:


    关闭正在访问磁盘的任何其他进程。这包括许多你真的不应该关闭的系统进程,因此我认为除了在Darwin上尝试运行它而不使用Mac OS X之外,你没有什么可以做的。

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

    另一种可能是:你把数据库拉到内存中,在你访问它时,它在调出和调出,因为还有其他运行的东西也需要内存。当没有其他东西使用内存并且整个数据库都放在内存中时,您可以快速运行。阅读数据库完全取决于你的代码。我绝对不同意对shark的评论。在我看来,Shark是迄今为止测量系统性能的最佳工具,尤其是跟踪系统调用、页面错误等。与仪器不同,它在采样时显示正确的线程状态。也许吧,但Joe不想要“系统性能”,至少如果我能正确判断问题的话。他想要的是应用程序特征化,这最好通过仪器获得。另一方面,我对问题的判断可能是完全错误的。db文件有多大?您的进度内存消耗情况如何(虚拟大小、驻留大小,请参阅top的输出)?