Xcode 时间分析器准确度
Xcode time profiler accuracy
我想知道从一个屏幕转到另一个屏幕所需的确切时间。例如,登录和访问下一个屏幕需要多长时间。
我尝试使用 Xcode 时间分析器,但它没有记录所有内容。我什至启用了 "High frequency" 选项,但我仍然认为缺少某些东西。我了解到,您必须使用路标才能达到准确性。哪个有效,但您必须将 iOS 版本设置为 12,并更改代码以添加 os_signpost。
有没有另一种方法可以在不更改 iOS 版本的情况下实现这一目标?还是代码?
您对另一个 Xcode 探查器工具或其他可以提供此输出的一般工具有什么建议吗?
我认为时间分析器会给我每个方法的开始和结束时间,类似于 Android Studio 分析器。我错过了什么吗?
"Am I missing something" 不是真的。内置时间分析器工具的核心功能是定位执行时间最长的方法,让您了解它们将时间花在哪里。如果您发现您可以从时间分析器中的列表转到实际代码的时间分析显示,显示其中特定调用所花费的时间,那么您基本上已经弄清楚了所有需要弄清楚的事情。如果您想将一段特定的代码括起来,正如您所说,这正是路标的用途。
一些观察:
是的,如果你想计算两点代码之间经过的时间,路标是一个很好的方法。如果您想知道这两个路标之间发生了什么,您可以通过单击 control 放大“兴趣点”范围。这让您可以专注于相关区域:
我建议选择“记录等待线程”。有时你的线程被什么东西阻塞了,如果你不选择这个选项,当你的线程被阻塞时它不会捕获样本,通常很难找到罪魁祸首。
(我也倾向于以延迟模式进行记录,以尽量减少观察者效应。)
你说
you have to set your iOS version to 12 ...
嗯,不完全是。当然,如果你想使用 os_signpost
,你必须在 iOS 12 device/simulator 上进行分析,但你不必更改应用程序的目标。您只需要将日志语句包装在 #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() { ... }
}
如果您不喜欢 if #available
检查并且您必须支持旧的 OS 版本,只需使用 kdebug
:
kdebug_signpost_start(0, 0, 0, 0, 0)
和
kdebug_signpost_end(0, 0, 0, 0, 0)
你的兴趣点范围没有很好的名字,但它适用于旧的 iOS 版本。
有关详细信息,请参阅 WWDC 2018 视频 Measuring Performance Using Logging。
我想知道从一个屏幕转到另一个屏幕所需的确切时间。例如,登录和访问下一个屏幕需要多长时间。 我尝试使用 Xcode 时间分析器,但它没有记录所有内容。我什至启用了 "High frequency" 选项,但我仍然认为缺少某些东西。我了解到,您必须使用路标才能达到准确性。哪个有效,但您必须将 iOS 版本设置为 12,并更改代码以添加 os_signpost。 有没有另一种方法可以在不更改 iOS 版本的情况下实现这一目标?还是代码?
您对另一个 Xcode 探查器工具或其他可以提供此输出的一般工具有什么建议吗?
我认为时间分析器会给我每个方法的开始和结束时间,类似于 Android Studio 分析器。我错过了什么吗?
"Am I missing something" 不是真的。内置时间分析器工具的核心功能是定位执行时间最长的方法,让您了解它们将时间花在哪里。如果您发现您可以从时间分析器中的列表转到实际代码的时间分析显示,显示其中特定调用所花费的时间,那么您基本上已经弄清楚了所有需要弄清楚的事情。如果您想将一段特定的代码括起来,正如您所说,这正是路标的用途。
一些观察:
是的,如果你想计算两点代码之间经过的时间,路标是一个很好的方法。如果您想知道这两个路标之间发生了什么,您可以通过单击 control 放大“兴趣点”范围。这让您可以专注于相关区域:
我建议选择“记录等待线程”。有时你的线程被什么东西阻塞了,如果你不选择这个选项,当你的线程被阻塞时它不会捕获样本,通常很难找到罪魁祸首。
(我也倾向于以延迟模式进行记录,以尽量减少观察者效应。)
你说
you have to set your iOS version to 12 ...
嗯,不完全是。当然,如果你想使用
os_signpost
,你必须在 iOS 12 device/simulator 上进行分析,但你不必更改应用程序的目标。您只需要将日志语句包装在#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() { ... } }
如果您不喜欢
if #available
检查并且您必须支持旧的 OS 版本,只需使用kdebug
:kdebug_signpost_start(0, 0, 0, 0, 0)
和
kdebug_signpost_end(0, 0, 0, 0, 0)
你的兴趣点范围没有很好的名字,但它适用于旧的 iOS 版本。
有关详细信息,请参阅 WWDC 2018 视频 Measuring Performance Using Logging。