【问题标题】:Xcode time profiler accuracyXcode 时间分析器精度
【发布时间】:2020-05-29 10:23:46
【问题描述】:

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

您对另一个 Xcode 分析器工具或其他一般工具有什么建议可以给我这个输出吗?

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

【问题讨论】:

    标签: swift xcode instruments


    【解决方案1】:

    几个观察:

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

    2. 我建议选择“记录等待线程”。有时你的线程被什么东西阻塞了,如果你不选择这个选项,当你的线程被阻塞时它就不会捕获样本,通常会更难找到罪魁祸首。

      (我也倾向于以延迟模式录制,以尽量减少观察者的影响。)

    3. 你说

      您必须将您的 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() { ... }
      
      }
      
    4. 如果您不喜欢 if #available 检查并且您必须支持较旧的操作系统版本,请使用 kdebug

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

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

      您的兴趣点范围没有好听的名称,但它适用于较旧的 iOS 版本。

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

    【讨论】:

    • 非常感谢您的详尽解释。我有一个额外的问题。构建发布应用程序时是否会自动忽略 kdebug,即使它在代码中?还是我必须把它包裹起来 #if DEBUG ?
    • 使用kdebug,您可能必须这样做。使用OSLog,您的OSLog 定义周围的if 逻辑将成为.disabled,如gist.github.com/robertmryan/880d047aa0f8033924f2d7fafa06ad23。顺便说一句,我不确定您是否想要#if DEBUG,因为您应该始终对优化的构建进行性能分析。在调试构建中对性能进行基准测试没有什么意义。
    • 是的,您对在优化的构建上执行性能分析是正确的。再次感谢您的帮助!
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-20
      • 2019-03-15
      • 2023-04-01
      • 2014-01-26
      • 1970-01-01
      • 2021-11-24
      • 2016-11-29
      • 2014-08-18
      相关资源
      最近更新 更多