Xcode时间分析器精度

问题描述 投票:0回答:2

我想知道从一个屏幕转到另一个屏幕的确切时间。例如,登录和访问下一个屏幕需要多长时间。我尝试使用Xcode时间分析器,但它不会记录所有内容。我什至启用了“高频”选项,但我仍然认为缺少某些内容。我了解到的是,您必须使用路标才能实现准确性。可以,但是您必须将iOS版本设置为12,并更改代码以添加os_signpost。是否有另一种方法可以实现而无需更改iOS版本?还是代码?

您对其他可以提供此输出的Xcode Profiler工具或其他工具有什么建议吗?

我以为时间分析器会为我提供每种方法的开始和结束时间,类似于Android Studio分析器。我想念什么吗?

swift xcode instruments
2个回答
1
投票

一些观察:

  1. 是的,如果您要计算两点代码之间的时间,路标是一种很好的方法。而且,如果您想知道这两个路标之间发生了什么,可以通过单击[[control来放大“兴趣点”范围。这使您可以专注于相关区域:

    enter image description here
  2. 我建议选择“记录等待线程”。有时您的线程被某物阻塞,如果不选择此选项,则在线程被阻塞时它不会捕获样本,这通常会使查找罪魁祸首变得困难。

    enter image description here

    ((我也倾向于以延迟模式进行录制,以最大程度地减少观察者的影响。)

  3. 您说过
  4. 您必须将您的iOS版本设置为12 ...

    嗯,不完全是。当然,如果要使用os_signpost,则必须在iOS 12设备/模拟器上进行性能分析,但不必更改应用程序的目标。您只需要将日志记录语句包装在#available块中,例如:

    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) } }

    import UIKit import os.log class SecondViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() somethingSlow() } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) if #available(iOS 12.0, *) { os_signpost(.end, log: pointsOfInterest, name: "Transition") } } func somethingSlow() { ... } }

  5. 如果您不喜欢进行if #available检查,并且必须支持较旧的OS版本,只需使用kdebug
  6. kdebug_signpost_start(0, 0, 0, 0, 0)

    kdebug_signpost_end(0, 0, 0, 0, 0)

    您在兴趣点范围内没有很好的名字,但它在较旧的iOS版本中适用。

    有关详细信息,请参阅WWDC 2018视频Measuring Performance Using Logging


0
投票
“我想念什么吗?”不是。内置的时间分析器仪器的核心功能是查找执行时间最长的方法,并让您了解它们在哪里花费时间。如果您发现可以从时间分析器中的列表转到实际代码的时间分析显示中,以显示其中的特定调用所花费的时间,则基本上可以确定所有要解决的问题。如果您想将一段特定的代码括起来,正如您所说的,这正是路标的目的。
© www.soinside.com 2019 - 2024. All rights reserved.