ProfileSwiftUI 让你更清晰地了解你的 SwiftUI 应用中 CPU 的消耗情况。 使用方法:添加 ProfileSwiftUI Swift 包,然后导入它,并在你的 RootView 中添加类似下面的代码来设置日志记录,然后开始轮询统计数据。
init() {
ProfileSwiftUI.profile(interval: 10, top: 5)
}
输出相当冗长,因为它还会记录 SwiftUI 在内部对 “AttributeGraph” 框架(SwiftUI 基于此框架)的调用,尽管可以通过传递正则表达式来过滤掉这些调用(它们仍然会出现在定期的性能分析摘要中)。 输出按被调用的函数分组,详细条目则分解了该函数是从哪里被调用的。
在你的应用和 SwiftUI 框架之间的接口处,SwiftUI 内部的方法通过一种查找形式间接分派,这种查找使用了内存中的可写区域(这是 Darwin 动态链接器在框架之间进行“绑定”的标准方法)。 使用 fishhook 库,可以按符号名称更新此分派表,并“重新绑定”或“介入”您想要的这些函数的任何实现。
SwiftTrace 库允许您在每个函数调用周围生成一个日志切面(跳转指令),您可以介入这些切面来代替原始调用目标。 为了记录对 AttributeGraph 的调用,在 SwiftUI 库调用外部时,会对该库进行第二组介入。 不知何故,第二个介入只在模拟器中有效。