大多数浏览器和
Developer App 均支持流媒体播放。
-
Measuring Performance Using Logging
Learn how to use signposts and logging to measure performance. Understand how the Points of Interest instrument can be used to examine logged data. Get an introduction into creating and using custom instruments.
资源
相关视频
WWDC23
WWDC18
-
下载
下午好 我叫 Shane 我来自 Darwin Runtime 团队 欢迎大家来到 “使用日志来 衡量性能”
我们在周一听到了很多 关于性能的东西 性能是 良好用户体验的 关键之一 人们希望他们的游戏 和 App 能跑得快 同时兼具流畅性和灵敏性
但软件是复杂的 这意味着当你的 App 在运行时 有时还同时发生着很多事情 这意味着你可以 从一些意想不到的地方 找到性能的突出点 这么做的话 发觉这些性能突出点需要你 对程序的行为有所理解 有时需要 更深的理解 它要求你知道 你的代码具体在什么时候运行 一段运算具体花了多少时间 所以这是一个 能让好工具真正发挥作用的地方 我们知道开发更好的工具 并交给你们使用 可以使我们 帮助你们成为 更有效率的开发者 所以今天我要说说 一个这样的工具 今天我要说说 Signposts Signposts 是 OSLog 家族中的 新成员 你可以在 macOS 中使用 你也可以在 iOS 中使用 你可以在 Swift 和 C 里面使用 但最酷的是 我们将它整合进了 Instruments 这意味着 Instruments 可以 获得 Signposts 产生的数据 让你对程序的行为 有更深的理解
首先简单讲下历史
我们在几年前就推出了 OSLog 这是我们关于日志设备 的新想法 这是我们从系统中 获取调试信息的方式 我们是怀着提升效率的目标 并牢记着隐私的重要性 来开发它的
这里你可以看到一段 OSLog 的代码示例 我刚刚创建了一个简单的日志句柄 并把 “hello world” 传给了它 Signposts 继承了 OSLog 的 API 但它是为了描述 性能使用的情况 这意味着它们在传达 和性能有关的信息 并且我们把它 整合进了我们的开发者工具中 也就是说你可以 用 Signposts 来给你的 代码加上注释然后打开 Instruments 就能看到这个
在这里 Instruments 向你展示了 关于程序行为和 Signposts 活动 的一个漂亮时间线 然后在底部 有一个聚合了 Signposts 统计和分析数据 的表格 通过筛选拆解 来检查你程序的 行为
此次会议中我会讲 如何在你的代码中使用 Signposts 并向你展示 它的功能 然后我们将展示 新的 Instrument 和 Signposts 的图像 使你对 Signposts 和 Instrument 的协作有直观的理解 让我们开始吧 我先从一个非常简单的例子开始 假设这是你的 App 你想调查 一块特定界面 刷新所需要的时间 要达到这个目标 你要加载一些图片并将它们 放在屏幕上 所以简单来说从 App 的 这个 App 做的工作就是抓取素材 当你抓取完所有素材以后 界面就刷新了
一个 Signpost 允许我们 标记一段行为的开始 和结束然后将 这时间上的两点 和这两个日志事件关联 它们通过调用了一个 os_signpost 函数来完成 有两种调用方式 一种是 .begin 一种是 .end 这里我用一个下面 带 b 的箭头代表开始 用下面带 e 的箭头 代表结束 然后我们将这两点 联系起来 让你知道 这个间隔经过了多少时间 好了 代码里这里有一段 这个算法的简单应用 对于界面的每个元素 我们都要获取素材 并且想要测量 这个操作所需的时间 要将 signpost 导入 这段代码里 我们只需将包含这个功能 的 os.signpost 模块导入 然后因为 Signposts 是 OSLog 功能的一部分 我们要创建一个日志句柄 这里 这个日志句柄有两个参数 一个 subsystem 和一个 category subsystem 可能在你整个 项目中都是 一样的 它看起来非常像你的套装 ID 它代表着软件的 组成部分 可能是你使用的框架
category 是用来关联 将相关的操作或者相关的 signposts 组合在一起 稍后你将在会议中看到 为什么它很有用 当我们有了日志句柄后 我们将调用 os_signpost 函数两次 一次用 .begin. 一次用 .end. 我们将日志句柄传给 这几次调用 第三个参数 是 signpost 名称
signpost 名称是 一个字符串常量 用来确定间隔时间 用来确定我们想要测量的操作
这个字符串常量是 用来匹配我们 通过调用的 os_signpost 函数 注释或标记过的 开始点和结束点 所以在我们的时间线上 看起来就像这样 在每段工作的开始 我们放了一个 os_signpost 在每段工作的结束 我们放了一个 os_signpost 因为这些字符串常量 在开始和结束的调用点上 按顺序排好了 我们可以将它俩匹配 但是如果我们想要 测量整段操作 完成全部刷新 所花的时间呢 在我们代码里 我们只需添加另一对 os_signpost begin 和 end 调用 非常简单 这次我赋予了一个 不同的字符串常量 所以就有一个不一样的 signpost 名称 这次用了 “Refresh Panel” 来表示这是一个独立的间隔时间 和循环里的间隔时间相独立
在我们的时间线上 我们标记了另外两个 signposts
而匹配的字符串常量 “Refresh Panel” 让系统知道 这两点是相关联的
好了 这并不是个超级简单的例子 如果你的程序一直 按第一步第二步 然后第三步的顺序来走 这么做是可以的 但在我们系统中 经常有很多工作是异步发生的 嗯 并不是有第一步 第二步第三步 我们通常按顺序开始 对吧 然后 稍后再完成它们 这意味着 这些操作可以 同时发生 他们可以重叠
在这种情况下我们需要 给系统一些 额外的信息 以让它区分开 这些 signposts
要做到这一点 目前我们只用到了名称 对吧 这个名称会匹配 开始和结束点 所以字符串常量现在 已经标识了时间段 但还没有让我们可以 区分重叠的时间段 要做到这一点我们给 Signpost 调用添加 了另一块信息 叫做 signpost ID
signpost ID 会告诉系统 这些是同一类型的操作 但是它们之间 又互相不一样 所以如果两项操作重叠了 但它们有着不同的 signpost ID 系统就会知道 它们是不同的时间段 只要你将相同的 signpost ID 传给了开始调用点 和结束调用点 这两个 signpost 就会 相互关联
你可以通过这个构造函数 使用一个日志句柄 来创建 signpost ID 但你也可以 通过对象来创建 如果你有一些对象 代表你想做的事 那么这样就很方便 只要你使用了 对象的同一实例 就会生成同样的 signpost ID 这意味着你不需要 到处携带和存储 signpost ID 你可以直接使用对象
直观上你可以将 signpost ID 想成允许我们 向每次 signpost 调用 传递一点额外的背景信息
对于一段特定的操作 它可以将开始和结束标记联系起来 这很重要因为这些操作 不仅可能会重叠 它们还通常需要花 不一样的时间 让我们到示例代码中看看
这就是我们的代码 我要将同步获取 异步调用转换成 异步获取 现在我要给它一个 completionHandler 当素材获取完毕后 这个闭包就会运行
然后我又添加了 一个闭包一个 completionHandler 在素材获取完后就运行 在每种情况下我都将 os_signpost 结束调用 放在了闭包内来指示 这就是我想要标记时段 结束的时间
OK
因为我们觉得 这些时段会互相重叠 我们想针对每个时段 创建新的 signpost ID 注意在上面的例子中我已经 通过构造函数使用日志句柄 创建了一个 第二个 我是通过
然后我将这些 signpost ID 传给调用处 做完了 你可以将 signpost 想成 整理好的一种 分类或者层次 对吧 所有这些操作都由 日志句柄相关联 代表日志类型 对我们感兴趣的每段操作 我们赋予了它一个 signpost 名称
然后因为这些 signpost 可能互相重叠 我们给了它们 signpost ID 告诉系统这是 那段时间的一个 特定实例
这个界面专门 设计得很灵活 这样你就可以在开始点 和结束点控制所有的参数 你可以控制 signpost 名称 赋予的日志句柄和 ID 我们这么做是因为 只要你在开始点 和结束点提供了相同的参数 那两个 signpost 就能够互相匹配 这意味着你的开始和结束点 可以在不同的函数中 它们可以和不同的对象 相关联 它们甚至可以存在不同的 源文件中 我们这么做是因为我们想 让你可以在你的代码里使用它 所以无论你有什么 进入和退出的条件 你都可以调用 这就是如何使用 signposts 来测量间隔时间 可能你还想随 signposts 传达一些额外的信息 一些额外的 和性能有关的信息 对于这个 我们有办法 向 signpost 调用添加元数据
这是你的基础 signpost 调用 在此基础上我们可以 添加一个字符串常量参数 这允许你为你的 开始和结束调用点添加一些 背景信息
对于一段特定的操作 你可能有很多进入和退出点 但是字符串常量 也是一个 OSLog 格式的字符串 这意味着我可以拿它来 向 signpost 传递额外的数据 这里 比如说 我使用了 %d 传递了四个整数
但是因为这是一个 OSLog 格式的 字符串 我还可以使用它来 传递许多不同类型的参数 这里我传递了一些 浮点数 我甚至使用了格式说明符 来告诉系统 我想要的精确度 你也可以使用字符串常量 formatter 来传递动态字符串 这样我们可以 传递来自函数调用 或者来自 用户输入的信息 而我们使用 固定大小的存储量来引用 这个格式的字符串常量 这意味着你可以想 让它多长和易于理解 都行
这段易于理解的字符串 跟之后 Instruments 渲染的 是一样的 所以你可以随意给它一些背景 我在这里列举了 很多参数 Instruments 能够展示 完整的渲染后的字符串 或者它仍然对所附的 数据有程序访问权限
除了这些时段的 元数据以外你可能还想 添加独立的时间点 也就是说除了 开始 signpost 和结束 signpost 以外 你还可以有这样一个 signpost 它没有跟一个特定的 时间段绑定 而是跟一个固定的时刻绑定 对于这个我们有一个 类型为 event 的 os_signpost event 类型的 os_signpost 的调用和开始结束的调用 看起来一样 只不过多了 event 的类型 它标记了一个特定的时间点 你可以在时间段的 范围内使用它 或者可能你想追踪 独立于一个时间段的事件 比如一次用户交互 所以对于我们刚刚讲的 获取素材的时间间隔 你可能想知道 你在什么时候连接到了 提供这个素材的服务 或者你可能想知道 你在什么时候 接收到了其中的几个字节 你可以使用这个 在一个时间段过程中 多次更新 此时间段的状态和进展
或者你可能想追踪一个 触发事件比如 一次用户界面交互 比如有人刚滑动屏幕 来更新界面 虽然如果你真的在 研究一个性能问题 他们可能滑动了很多次 所以这可能是你看到的
如果你启用了 signpost 默认情况下它们是开启的 但是我想讲讲 有条件地开启和关闭它们
首先我想强调 我们把 signpost 设计得 轻便小巧 这意味着我们做了很多 来优化它们的启动时间 我们通过优化了编译器 使得任务能 提前进行而非 在运行时 我们还推迟了很多事情 使它们可以在 Instruments 后台运行 这意味着当 在发送 signposts 时 它们只会占用非常少的系统资源 我们这么做是因为我们想 最小化它给你的代码运行 带来的影响 我们这么做还因为 我们想确保即使 你的时间跨度非常小 你也能发送很多 signpost 来得到一些 精确的测量结果
但是你也可能想要 关闭你的 signpost 你可能想要通过 特定路径中的代码消除 尽可能多的开销 或者你可能有两种类型的 signposts 两种的体量 都非常大 但是在某一时刻 你仅仅想对其中一种 进行除错 要这么做的话 我们要利用 OSLog 的一个功能 禁用的日志句柄 禁用的日志句柄是一个 简单的句柄 它的功能是把 对于该句柄的 OSLog 和 os_signpost 调用 都变成类似于空操作的东西 事实上 如果你在 C 当中使用它 我们甚至会帮你检查行 我们甚至不会 评估剩下的参数 所以你可以在运行时 修改这个句柄 让我给你看个例子 让我们回到一开始 使用的第一段代码示例 你可以在上面看到初始化的 日志句柄 而我现在要让这个初始化 有条件地发生 所以我要么将它分配给 普通的 os_log 构造函数 或者把它分配给 禁用的日志句柄 如果我们采取第一种方法 所有的 os_signpost 调用都会 按照我刚刚说的一样进行 但如果我们采取第二种方法 这些 os_signpost 调用都会变成 接近于空操作 我刚刚说过 我没有必要调用任何我的 调用 我没有必要改变 我的任何调用 我只需要改变初始化 我让初始化条件 依赖于环境变量 你可以在 对程序进行调试时 在 Xcode scheme 中 对此进行设置 我刚才说你没有必要 在调用处内进行改变 但是你可能有一些 用于特定 instrumentation 的功能 也就是说虽然代价高昂 但可能只有在调试时 才使用它 这种情况下你可以检查一个 特定的日志句柄 看看在启用 signpost 属性中是否启用了 signpost 启用了 signpost 的属性 可以用来控制 额外的操作
好的 我刚展示过的所有例子 都是用的 Swift 但是 signposts 也可以用于 C
我刚刚讲过的 所有功能都可以用 日志句柄 发送三种不同的 signpost 以及管理 你的 signpost 标识符 对于那些对使用 C 感兴趣的人来说 我鼓励你们阅读标题文档 标题文档涵盖了所有 我刚讲的信息但是是从 C 语言开发者的角度写的
好了 现在你知道了如何在 代码中使用 signpost 或许你对它们代表的东西 有了一个思维模型 所以我想让你们看看 signposts 如何与 Instruments 协作 这一块 我要把 剩下的环节交给 我的同事 Chad 谢谢
好了 谢谢你 Shane
今天我要向大家演示 Instruments 10 的 三个重要的新功能 帮助你更好地 处理 signpost 数据 第一个就是新的 os_signpost instrument 这个 instrument 允许你 记录 图形化 并分析你 App 的所有 signpost 活动 下一个功能是 points of interest 我会大概讲讲什么是 points of interest 你会在什么时候使用它 然后我会向大家展示 新的自定义 instrument 功能 以及如何同 os_signpost 使用它来得到关于 signpost 的更精确的 一个表示 让我们看看 操作示范吧 好的
首先让我们 看看我们的示例程序 这是我们的 Trailblazer App
这个 App 向你展示了 当地的登山路线 当我们往下滑时 它会为你下载这些好看的图片
你会注意到最开始 是白色的背景然后 图片随后出现 填充了背景 对于这类 App 这是非常常见的现象 有时它植入了 future 或者 promise 但是这个现象 虽然它对 性能很有帮助 它也很难被配置 原因在于有很多异步的 活动在同时进行 当用户滑动时 有一些下载在同时进行 如果用户像这样 飞快地滑动时那么 在图像单元重新被使用 之前下载可能还没有完成 那么我们就得取消下载 如果我们取消失败了 那么一些下载就会 并行运行但是我们 并不想这样 让我们看看如何 使用 signposts 来分析 我们的 Trailblazer 的 App 在路线单元中 有一个方式叫做 startImageDownload 当我们需要下载新图像时 它就会被调用 它传递了需要被下载的 图像名称 现在我们在这里有一个 download helper 的类 我们创建一个传递名称的实例 将我们自己设为委托 当它下载完后就会 回调我们 这种情况下 既然 downloader 代表 同时进行的活动 这个异步的工作 就是 signpost ID 的绝佳依据 我们现在用我们的 downloader 对象来创建 signpost ID
要启用我们的 signposts 我们要做一个 os_signpost begin 我们将它发送到 我们的 networking 日志句柄 快速浏览下我们的 networking 日志句柄 你可以看到我们使用了 Trailblazer 套装 ID 和 networking 类别 现在我们要传递一张图像 不好意思是背景图片的 signpost 名称这样我们 就能看到所有背景 图片的下载 它会传递我们创建的 signpost ID 我们给开始附上一些 元数据来传达我们 下载的图像的名称 然后我们开始下载 我们设置属性 来追踪下载 目前设为 runningDownloader
这个完成后我们会在这里 有一个 didReceiveImage 回调 然后我们将图像视图 设为接收到的图像
然后我们结束调用 signpost 然后我们将使用完全 一样的日志句柄 一样的名称 一样的 signpost ID 但这次 我们将附上一些 结束的元数据比如 “finished with size” 你会注意到这里 我们给了这个参数标记了 Xcode:size-in-bytes 的特征 这个东西告诉 Xcode 和 Instruments 这项参数在显示 和分析中都应被当做 size-in-bytes
这些叫工程类型 你可以在 Instruments 开发者帮助指南中 读到 就在 Instruments 的帮助菜单中 当我们完成下载后 我们可以将它设为 nil 我们有两种方式来 结束下载 一种是成功的情况 而我们还要考虑 取消的情况 准备重新使用时 如果我们 现在有一个正在运行的 downloader 我们首先需要 取消这个 downloader 这种情况下我们要 为这个时间段创建结束点 然后我们使用同一个 日志句柄 signpost 名称 signpost ID 然后我们使用 cancelled 作为结束元数据来隔开它 当我们成功完成时
这些应该足够 来配置了 现在我们到这里来配置产品 而当我们完成 构建和安装后它就会 启动 Instruments 它会在这里启动 Instruments 我们可以创建一个空白的 新文档 然后我们到 library 中 我可以向你展示如何使用 新的 os_signpost instrument 这里有我们新的 os_signpost instrument 然后我们把它拖动 挪到这里 我们给它在这里 多留点空间然后我们 按下录制 然后我们拿出 iPhone 回到开始状态 好了 现在我们要开始滑动 然后我们也会 非常 非常快得滑动屏幕 然后我们让它停下 现在我们返回到 Instruments 中看看我们记录下了 什么数据 现在我要停止录制 现在你可以注意到 在轨迹视图中 我们可以直观地看到 所有背景图片时间间隔 这是 signpost 名称 如果我们按住选项键 然后放大你可以看到 有一些时间段 时间段被 开始元数据和结束 元数据标记 如果我们缩回去 然后再次观察轨迹 我们会注意到 只有少于五张的图片 在同时进行下载 这是一件好事 这意味着我们取消成功了 如果我们想确认的话 我们可以到这里然后 你可以看到许多 时间间隔的元数据都 写着下载时被取消 如果你想 如果 你想看看数据 或者说你想看看 这些间隔的持续时间 那么你可以来这里 看看这些间隔的概要 然后我们看到按类别 进行了细分 然后按 signpost 名称然后按开始信息 然后按结束信息 如果我们把这个缩小 你可以看到我们 发送了 93 次图片下载请求 其中 12 次是针对于位置 1
在这 12 次中 7 次被取消 5 次完成 大小为 3.31 MB
如果你现在看这里 这些是关于时段的 统计数据 然后你们可以看到 被取消的最小和平均 时间段比 下载完全的时间段 要小很多 这就是在这种 情况下你期待看到的
现在如果你想要看所有 被取消掉的事件 因为你对这些很感兴趣 你可以按下这个聚焦箭头 然后它会带你跳转到一个 列表视图你可以在这里看到 所有地方 其中位置 1 有结束信息 “cancelled” 并且当我们浏览的时候 你会看到轨迹 上方的探头 会移到每一个 时间间隔处 所以你可以追踪所有 失败的情况如果你 感兴趣的话 这是一个查看这些 间隔的时间 时间点的好方法 但是如果你想进行对这些 元数据进行分析呢 如果你想确定 有多少字节的图像数据 是我们已经从网络上下载了呢 我们已经发送了元数据信息 比如 “Finished with size” 然后是它的大小 如果我们能把这些参数加起来 那就太棒了 所以,如果你想这么做 你可以在这里选择 “summary of metadata statistics”
你可以看到 我们将它分解成了子系统 种类和格式化字符串 在格式化字符串下面 是它的参数 由于我们的格式化字符串 只有一个参数 所以就是 arg0 现在 Instruments 已经将这些加在一起了 并且它知道这是一个 以字节计的大小 它给了我们一个精准的计算 结果为 80MB 所以我们一共下载了 80MB 的图像数据 现在你在这里可以 看到不同的列 有最小值 最大值 平均值 还有标准差 所以这是一个很好的方式 来查看你通过 元数据传递的值的统计分析 Shane 刚刚提到 signposts 非常轻量 这是完全正确的 除非你像我 刚刚跑 Instruments 那样运行 Instruments 在 immediate 模式下 即默认录制模式下 Instruments 几乎是在 实时展现和记录数据 所以当它进入到 immediate 模式录制时 所有的 signposts 都必须直接 发给 Instruments 我们就避开了 在操作系统中 缓冲能获得的优化 现在,通过我们的 signposts 通过我们的 signposts App 我们并不会真正创建足够多的 时间间隔使我们注意到花销 但是如果你有一个游戏引擎 并且你想要每秒发送 数千个 signpost 这时开销就会开始累积变多 所以为了避免这个问题 你可以在你 录制之前改变 Instruments 的录制模式 你可以通过 下拉录制按钮 然后选择录制选项来实现
在这块全局选项 的区域中你可以看到 我们选中了 immediate 模式 我们可以把它变成 last 5 second 模式 这种模式通常被称为 窗口模式 它告诉操作系统 和录制技术 我们不需要 每一个事件 我们只想要最后五秒 的内容 当你这么做时 Instruments 会让开 然后让操作系统来做 这是一个非常常见的模式 我们将它用于系统追踪 我们将它用于 metal 系统追踪 和新的游戏性能模板 所以这是一种在你的 App 中 寻找卡顿和挂机的非常常见的方式 好了 这就是我们的 os_signpost instrument
现在让我们来说说 points of interest
现在如果我们回到 Trailblazer App 你注意到当我点击一个路线 它就显示详细内容 如果我返回点一个 不同的路线它就显示 不同的详细信息
如果我们能追踪 每一次详细信息界面的 的出现那就好了 因为这样我们就能分辨出 我们的用户在试图做什么 我们知道用户在 App 中 所处位置
你当然可以用一个 signpost 来做这个但是你必须在 os_signpost instrument 里拖动并记录下 App 中 所有 signpost 的活动 它某种程度上降低了 这些用户使用事件 的重要性 所以我们允许你 将它们弄到 points of interest 中去 现在如果我到代码里 查看细节控制器 看我们的 viewDidAppear 方法 你可以看到我正在发布 我正在创建一个 os_signpost 事件 显示 “Detail Appeared” 以及细节的名称
这被发送给我们创建的 一个特别的日志句柄 叫 points of interest 创建它的方式是 创建一个带子系统 标识符和系统 points of interest 类别的 日志句柄 这是一个 Instruments 会查找的特殊类别 当它看到这里的 points 它会把它们放到 points of interest instrument 里 如果我们回到这里然后点击 time profile 你可以看到 这里自动包含了 points of interest instrument 如果我们录制下来 然后进行同样的基础操作 我们进入 Matt Davis Trail 然后我们回到 Skyline Trail 然后再回来 我们再做一次为了测得更准
现在当你返回到 Instruments 你可以看到 这些 points of interest 突出显示 所以你能看到 在你 App 中 你的用户所处位置 你可以将这个和其他 性能数据关联 所以 points of interest 可以让你 从你的 App 中 选择一些最重要的 兴趣点然后把它们 提供给你团队中 或者开发社区中的 每一位开发者 然后他们可以立即看到 points of interest
好了 这就是 points of interest instrument 以及如何从 signposts 中创建 points of interest
另一个 Instruments 10 中 很好的功能是 你可以创建自定义的 instrument 为了向大家展示 在 os_signpost 可以对自定义 instrument 做什么 我们创建了 作为项目的一部分 一个 Trailblazer instruments 包
我现在要构建并运行 你可以看到当我们在做时 我们启动了 Instruments 的一个独立备份 里面有我们刚建的包 如果我们将版本调出来 可以看到我们现在 有一个 Trailblazer Networking 轨迹模板 如果我们选中它可以看到 我们有一个 Trailblazer Networking instrument 在我们的轨迹文档中
让我们开始录制 然后看看我们的 points of interest 的区别 不好意思 我们的 os_signpost 和自定义 instrument 可以做什么 我们要做同样的事情 我们开始基本的下载 然后回来 然后分析我们的轨迹 现在这里显示的 完全不一样 让我们放大 然后 观察 你看到在这里左边 我们没有按 signpost 名称细分 而是按下载的图像 现在我们可以看到图二 是在这里和这里下载的 我们在每处标记了 下载的大小 单位是兆 我们把他们标成红色 如果下载大小大于 3 1/2 MB 的话 这是我们创建的自定义图像 是自定义 instrument 的一部分 现在在下面我们还 定义了一些细节 这里有一张非常简洁的 下载任务表 并且你可以通过它们 来浏览轨迹 我们还有 让我看看 能不能把它弄回这里来 我们还有一个对所有下载 的概要 非常简单 我们只想加起来求和 我们还有个很棒的东西 叫 Timeslice 在 Timeslice 视图中 我们这么做是想要 回答我之前提出的问题 这些东西中 哪些实际上是并行 运行的 如果你想看看 并行运行的 时间段你只需要 拖动这里的 的探头然后你就可以 看到在任一时间点上 和该探头相交 的部分 所以这是一个很好的 但不同的检查 signpost 数据 的方法
如果你在和别人 一起做一个项目或者 你是开发者社区的 一员那么使用自定义 instrument 能够很好地 获取 signpost 数据 改造它 这样其他人 就可以直接使用并 不需要懂得你代码的 运行细节就能理解 所以它们是一个非常重要的功能 好消息是要创建 这样的一个 instrument 全部软件包定义 只有 115 行 XML 所以自定义 instruments 非常有表现力和强大 但又非常简单 这就是关于我们演示的总结
在今天的会议中 我们查看了 signpost API 我们向你们展示了如何用它 在你 App 中标注 值得注意的行为 和时间段 我们展示了如何收集 元数据并将元数据 放入 Instruments 来 可视化和做分析 我们展示了如何在 os_signpost 中合并 自定义 instrument 来创建 更好的 signpost 数据展示
所有的这些总结下来 就是我们可以给你 你需要用来 提升 App 性能的信息 所以我们很高兴看到 你使用 os_signpost 和 Instruments 来一块提升 你 App 的用户体验
这就是今天的内容 想要了解更多信息 你可以来实验室找我们 技术实验室 8 今天下午三点 同时明天我还有会议 410 创建自定义 instrument 我会讲讲 自定义 instrument 的工作原理并向你们 展示我们如何创建的 Trailblazer networking instrument 包 非常感谢 享受剩下的会议吧 [ 掌声 ]
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。