【问题标题】:How to know when iOS app becomes responsive / Hang time如何知道 iOS 应用何时响应/挂起时间
【发布时间】:2022-02-03 23:06:08
【问题描述】:

有没有办法知道 iOS 应用何时响应用户交互?例如,用户点击一个按钮,应用程序执行工作,这个工作可能会异步调度其他工作到主线程。为了将其用作性能指标,我想知道应用程序再次能够以响应方式处理触摸事件的确切时刻。有了这个,我想要像“平均而言,应用程序在用户交互后 55 毫秒响应”这样的数据。

目前,在用户交互之后,我会立即观察主队列并有一个向其提交样本的启发式方法,以便根据主队列的响应性来估计响应性,假设主队列的响应性与应用程序直接相关'反应能力。采样只发生在队列再次持续响应一段时间(例如 100 毫秒)之前。这种方法有什么缺点吗?我可以/应该使用其他方法吗?

使用 MetricKit 监视挂起时间不是一个选项,因为我无法将这些结果用于特定交互(即了解不同的交互如何影响挂起时间)。

【问题讨论】:

    标签: ios performance grand-central-dispatch responsiveness


    【解决方案1】:

    你说:

    例如,用户点击一个按钮,应用程序就会执行工作。我想知道应用再次能够以响应方式处理触摸事件的确切时间。

    主线程应该永远被阻塞。它应该始终响应。 (如果您的应用需要,您可以禁用 UI,但无论如何都不要阻塞主线程。)

    因此,考虑到这一点,如果您要开始一些需要一点时间的过程,您应该:

    1. 如果您希望应用让用户知道一个耗时的过程即将开始,请将该 chrome 添加到 UI(例如 UIActivityIndicatorView,也称为“微调器”或其他);

    2. 在后台队列上异步启动该任务(这样它就不会阻塞主线程);

    3. 给该任务一个“完成处理程序”闭包,当后台工作完成时它将调用它;

    4. 在该完成处理程序中,调用者可以提供代码以删除在上述第一步中添加的任何镶边。

    简而言之,与其担心“应用程序如何知道主线程何时再次空闲”,您应该专注于首先消除任何会阻塞主线程的东西。见Understand and eliminate hangs from your app

    【讨论】:

    • 感谢您的回复。抱歉,我的问题应该更清楚。执行的工作量是动态的和服务器驱动的。我需要这个作为性能指标。这个具体问题不是减少工作量,而是衡量工作量,考虑到它可能包含像委托一样异步分派的工作,因此不仅仅是衡量开始和结束的问题。
    • 感谢您的评论:我的意思是您可以通过多种方式测量经过的时间,但是“为了根据主队列的响应性来估计响应性”的想法在主队列始终响应。现在,如果您不是指“主队列”而是指“UI”(因为您在启动异步进程之前禁用 UI,并在完成后重新启用 UI),那是另一回事。但是主队列应该始终响应。如果没有,首先应该先解决这个问题。
    • 谢谢 Rob,我同意主队列应该始终响应。这正是我对其进行采样以测量无响应时间的原因。假设是在用户交互之后,应用程序变得忙碌以处理工作。我想回答的是,这项工作能持续多久,并且该应用程序能够再次以响应方式处理事件。当队列响应时,我会记录时间并停止对其进行采样,因此仅当我作为用户交互的结果提交工作时才会进行此测量。
    猜你喜欢
    • 1970-01-01
    • 2012-04-27
    • 2019-10-10
    • 2010-09-05
    • 1970-01-01
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    相关资源
    最近更新 更多