Swift Xcode时间剖面仪精度

Swift Xcode时间剖面仪精度,swift,xcode,instruments,Swift,Xcode,Instruments,我想知道从一个屏幕到另一个屏幕的确切时间。例如,登录和访问下一个屏幕需要多长时间。 我试着使用Xcode时间分析器,但它并没有记录所有内容。我甚至启用了“高频”选项,但我仍然认为缺少了一些东西。我的理解是,为了达到准确度,你必须使用路标。这是可行的,但您必须将iOS版本设置为12,并更改代码以添加os_路标。 有没有其他方法可以在不改变iOS版本的情况下实现这一点?还是密码 您对另一个Xcode探查器工具或其他可以提供此输出的工具有什么建议吗 我认为时间分析器会给我每个方法的开始和结束时间,类似

我想知道从一个屏幕到另一个屏幕的确切时间。例如,登录和访问下一个屏幕需要多长时间。 我试着使用Xcode时间分析器,但它并没有记录所有内容。我甚至启用了“高频”选项,但我仍然认为缺少了一些东西。我的理解是,为了达到准确度,你必须使用路标。这是可行的,但您必须将iOS版本设置为12,并更改代码以添加os_路标。 有没有其他方法可以在不改变iOS版本的情况下实现这一点?还是密码

您对另一个Xcode探查器工具或其他可以提供此输出的工具有什么建议吗


我认为时间分析器会给我每个方法的开始和结束时间,类似于Android Studio分析器。我错过了什么吗?

“我错过了什么吗”不是真的。内置时间分析器工具的核心功能是定位执行时间最长的方法,并让您了解它们在哪里花费时间。如果您发现可以从时间分析器中的列表转到实际代码的时间分析器显示,显示在其中的特定调用中花费的时间,那么您基本上已经了解了所有需要了解的内容。如果您想将一段特定的代码括起来,正如您所说,这正是路标的用途。

有几点观察:

  • 是的,如果您想计算两个代码点之间经过的时间,路标是一种很好的方法。如果你想知道这两个路标之间发生了什么,“兴趣点”范围,你可以通过点击控制按钮放大。这使您可以将注意力集中在有问题的领域:

  • 我建议选择“记录等待线程”。有时你的线程被某个东西阻塞了,如果你不选择这个选项,当你的线程被阻塞时,它将不会捕获样本,这通常会使找到罪魁祸首变得更加困难

    (我也倾向于以延迟模式记录,以最小化观察者的影响。)

  • 你说

    您必须将iOS版本设置为12

    嗯,不完全是。当然,如果你想使用
    os\u signpost
    ,你必须在iOS 12设备/模拟器上进行评测,但你不必更改应用程序的目标。您只需将日志记录语句包装在可用的块中,例如:

    import UIKit
    import os.log
    
    @available(iOS 12.0, *)
    let pointsOfInterest = OSLog(subsystem: Bundle.main.bundleIdentifier!, category: .pointsOfInterest)
    
    class ViewController: UIViewController {
        @IBAction func didTapNextButton(_ sender: Any) {
            if #available(iOS 12.0, *) {
                os_signpost(.begin, log: pointsOfInterest, name: "Transition")
            }
    
            performSegue(withIdentifier: "Next", sender: self)
        }
    }
    

  • 如果您不喜欢使用
    If#available
    检查并且您必须支持较旧的操作系统版本,只需使用
    kdebug

    kdebug_signpost_start(0, 0, 0, 0, 0)
    

    你的兴趣点范围上没有很好的名称,但它在较旧的iOS版本中工作


  • 有关更多信息,请参阅WWDC 2018视频。

    非常感谢您的详细解释。我还有一个问题。在构建发布应用程序时,kdebug是否会自动被忽略,即使它在代码中?或者我必须把它包装起来#如果调试?使用
    kdebug
    ,您可能必须这样做。使用
    OSLog
    ,您的
    OSLog
    的定义将具有
    if
    逻辑,如中所示。顺便说一下,我不确定您是否想要
    #if DEBUG
    ,因为您应该始终在优化的构建上进行性能评测。调试构建中的性能基准测试没有什么意义。是的,在优化构建上执行性能评测是正确的。再次感谢您的帮助!
    kdebug_signpost_start(0, 0, 0, 0, 0)
    
    kdebug_signpost_end(0, 0, 0, 0, 0)