我想知道从一个屏幕转到另一个屏幕的确切时间。例如,登录和访问下一个屏幕需要多长时间。我尝试使用Xcode时间分析器,但它不会记录所有内容。我什至启用了“高频”选项,但我仍然认为缺少某些内容。我了解到的是,您必须使用路标才能实现准确性。可以,但是您必须将iOS版本设置为12,并更改代码以添加os_signpost。是否有另一种方法可以实现而无需更改iOS版本?还是代码?
您对其他可以提供此输出的Xcode Profiler工具或其他工具有什么建议吗?
我以为时间分析器会为我提供每种方法的开始和结束时间,类似于Android Studio分析器。我想念什么吗?
一些观察:
是的,如果您要计算两点代码之间的时间,路标是一种很好的方法。而且,如果您想知道这两个路标之间发生了什么,可以通过单击[[control来放大“兴趣点”范围。这使您可以专注于相关区域:
((我也倾向于以延迟模式进行录制,以最大程度地减少观察者的影响。)
您必须将您的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() { ... }
}
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。