【问题标题】:How to find out what mach_msg_trap waits for?如何找出 mach_msg_trap 等待什么?
【发布时间】:2010-12-02 02:17:53
【问题描述】:

我在目标上分析我的 iPhone 应用程序,根据 Instruments,65% 的时间花在mach_msg_trap

我有一个永远运行的后台线程,并使用performSelectorOnMainThread:withObject:waitUntilDone: 将结果发送回主线程,大约每 2 秒一次。我不会等到完成。

【问题讨论】:

    标签: objective-c cocoa-touch performance instruments


    【解决方案1】:

    事实证明,我的应用实际上并没有将 65% 的时间花在 mach_msg_trap 函数上。这是我在 Instruments 中的配置错误。

    Sampler 工具默认为 All Sample Counts,这将测量所有线程而不管它们的状态。

    改为切换到运行采样时间,这将反映当前的实际工作负载。 Screenshot of Instruments http://developer.apple.com/library/mac/qa/qa2009/images/qa1619_running_sample_times.png

    【讨论】:

    • 这里所有的链接都断了
    【解决方案2】:

    如果您不希望您的主线程在等待此后台线程(或等待用户输入)之外做任何事情,那么没有什么可担心的——您的应用程序大部分时间都无事可做。

    如果您希望主线程正在积极地做其他事情,请更新您的问题以描述它。在这种情况下,您可能需要查看对 mach_msg_trap 的完整调用堆栈,因为它通常位于调用堆栈的底部,而实际浪费时间的地方更多。

    【讨论】:

    • 我不希望我的主线程做很多事情,除了接收更新并每 2 秒重绘一次屏幕。但是,我确实希望我的后台线程能够占用最后一个时钟周期。
    • 我仍然认为检查一下 mach_msg_trap 上面的调用堆栈可能是值得的,只是为了仔细检查你关于主线程应该只是空闲的假设。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-12
    • 2016-06-29
    相关资源
    最近更新 更多