Xamarin Profiler

本指南会探讨 Xamarin Profiler 的主要功能。 它会查看探查器、分析以及何时应使用它们,并查看分析 Xamarin 应用程序的标准工作流。

应用程序的成功取决于最终用户的体验。 作为开发人员,你可能已在应用中实现了一些非常出色的功能,但如果应用缓慢或完全崩溃,用户可能会卸载它。

一直以来,Mono 都具有强大的命令行探查器,用于收集有关在 Mono 运行时中运行的程序的信息,称为 Mono 日志探查器。 Xamarin Profiler 是 Mono 日志探查器的图形界面,支持在 Mac 上分析 Android、iOS、tvOS 和 Mac 应用程序,以及在 Windows 上分析 Android、iOS 和 tvOS 应用程序。

Xamarin Profiler 具有多种工具可用于分析 - 分配、周期和时间探查器。 本指南会探讨这些工具的度量值、分析应用程序的方式,并阐明每个屏幕上显示的数据的含义。

本指南会介绍常见的分析方案,并将探查器作为工具引入,以帮助分析和优化 iOS 和 Android 应用程序。

下载并安装

注意

需要订阅 Visual Studio Enterprise 才能解锁 Windows 版 Visual Studio Enterprise 或 Visual Studio for Mac 中的此功能。

Xamarin Profiler 是一个独立的应用程序,与 Visual Studio for Mac 和 Visual Studio 集成,用于从 IDE 中启用分析。

下载平台的安装包:

下载后,启动安装程序,以将 Xamarin Profiler 添加到系统。

探查器和分析

分析是应用程序开发中一个重要但经常被忽视的步骤。 分析是一种动态程序分析的形式 - 它分析处于运行中和使用中的程序。 探查器是一种数据挖掘工具,用于收集有关时间复杂性、特定方法和分配内存的信息。 探查器使你能够深入分析这些指标,以查明代码中的问题区域。

设计和开发应用程序时,请务必不过早地进行优化:换言之,要花些时间在将很少得到访问的区域开发代码。 这就是分析的力量。 探查器提供对代码库中最常用的部分的见解,并帮助定位需要花时间进行改进的区域。 开发人员应注意了解应用程序中大部分时间花在哪里,以及应用程序如何使用内存。

分析有助于所有类型的开发,但它在移动开发中尤其重要。 未经优化的代码在移动平台上比在台式计算机上更明显,而应用的成功取决于高效运行高效的、美观且经过优化的代码。

Xamarin Profiler

此 Xamarin Profiler 为开发人员提供了从 Visual Studio for Mac 或 Visual Studio 内部分析应用程序的方法。 探查器会收集并显示有关应用的信息,然后开发人员可以使用这些信息来分析应用程序的行为。 使用 Xamarin Profiler 分析应用程序有多种不同方法,即内存分析和统计采样。 它们分别通过“分配”和“时间探查器”工具进行执行。

目前,Xamarin Profiler 可用于在 Mac 上(通过 Visual Studio for Mac)测试 Xamarin.iOS、Xamarin.Android 和 Xamarin.Mac 应用程序。 探查器是 IDE 的单独进程,因此,除了从 Visual Studio for Mac 启动之外,它还可以用作独立应用程序来检查从 mono 日志探查器生成的 .exe 和 .mlpd 文件。

Profiler 支持

以下平台上提供了对 Xamarin Profiler 的支持:

  • Visual Studio for Mac(具有企业许可证的 macOS)

    • Android
      • 设备和模拟器
    • iOS
      • 设备和模拟器
    • tvOS(不支持时间检测)
      • 设备和模拟器
    • Mac
  • Visual Studio(仅企业版)

    • Android
      • 设备和模拟器
    • iOS [实验性]
      • 设备和模拟器
    • tvOS
      • 设备和模拟器

请注意,只能分析调试配置。

Profiler 基本信息

本部分介绍 Xamarin Profiler 的各个部分,并介绍其功能。

在应用中允许分析

在成功分析应用之前,需要在应用的“项目选项”中允许分析。

  • iOS:

生成 > iOS 调试 > 启用分析

iOS Options Dialog in Visual Studio for Mac

  • Android:

生成 > Android 调试 > 启用开发人员检测

Android Options Dialog in Visual Studio for Mac

启动 Profiler

在对 iOS 或 Android 应用程序进行分析时,可以从 IDE 启动 Xamarin Profiler,也可以将其作为独立应用程序启动。

从 Visual Studio for Mac 启动

  1. 首先,请确保应用程序已加载到 Visual Studio for Mac 中,并选择(默认)调试配置。
  2. 在 Visual Studio for Mac 中浏览到 运行 > 启动分析,或在 Visual Studio 中浏览到 分析 > Xamarin Profiler,以打开 Profiler,如下图所示:

Launching the Profiler from Visual Studio for Mac

如果未显示菜单项,请参阅故障排除指南

这会启动 Profiler 并自动启动应用程序分析。

Profiler 可用于测量内存和性能。 它通过“分配”和“时间探查器”工具实现此目的,我们将在下一部分详细介绍这些工具。

保存和加载 Profiler 会话

若要随时保存分析会话,请从 Profiler 菜单栏中选择“文件 > 另存为...”。 这会将文件保存为 mlpd 格式,这是一种特殊且高度压缩的格式,用于分析数据。

安装 Xamarin Profiler 后,可以在“应用程序”文件夹中找到它,如以下屏幕截图所示:

Open standalone Profiler from Mac

可以通过打开独立应用程序,选中“选择目标”并加载文件,将 .mlpd 文件加载到 Profiler 中。

有关详细信息,请参阅 生成 .mlpd 文件

Profiler 功能

Xamarin Profiler 由五个部分组成,如下所示:

  • 工具栏–位于探查器顶部,提供启动/停止分析的选项、选择目标进程、查看应用的运行时间,以及选择构成探查器应用程序的拆分视图。
  • 检测列表–此列表列出了为分析会话加载的所有工具。
  • 绘图图表 – 这些图表与检测列表中的相关工具水平关联。 滑块(显示在“时间探查器”下方)可用于更改比例。
  • 检测详细信息区域 - 包含当前工具的选定视图显示的数据。 我们将在以下部分中更详细地查看这些视图。
  • 检查器视图 – 其中包含分段控件可选择的节。 这些部分依赖于所选的检测,包括:配置设置、统计信息、堆栈跟踪信息和根路径。

分配

分配工具提供有关应用程序中对象创建和垃圾回收的详细信息。

探查器顶部是分配图表,它显示分析期间定期分配的内存量。 目前,分配图是分配的总数,而不是该时间点堆的大小。 从某种意义上说,它永远不会下降,只会增加。 这包括在堆栈上分配的对象。 根据使用的运行时版本,即使同一应用,图表看起来也可能不同。

分配工具中存在不同的数据视图,使开发人员能够分析其应用程序使用和释放内存的方式。 下面描述了这些视图:

  • 分配–显示所有分配的列表,并按类名对其进行分组。 这概述了正在使用的类和方法、其使用的频率,以及所使用的类的集体大小。 双击类将显示分配的内存:

分配的检查器视图提供了筛选和分组对象的选项,提供内存分配的统计信息和顶部分配情况,以及堆栈跟踪和根路径的视图。

  • 调用树 – 显示应用程序中所有线程的整个调用树,并包含有关每个节点上分配的内存的信息。 在列表中选择某个元素时,所有同级节点将显示为灰色。 可以展开树或双击该元素以向下钻取到它。 显示此数据视图时,可以使用显示设置检查器视图来更改显示方式。 目前有两个选项:
    1. 反转调用树–这将从上到下考虑堆栈跟踪。 这是一个方便的视图选项,因为它是指示 CPU 花费时间的最深层方法。
    2. 按线程分隔–此选项按线程组织调用树。
  • 快照–此窗格显示有关内存快照的信息。 若要在分析实时应用程序时生成这些应用程序,请单击工具栏中的相机按钮,以查看保留和释放了哪些内存。 然后,可以单击每个快照来探索发生在内部的情况。 请注意,只能在实时分析应用时创建快照。

时间探查器

时间探查器检测可精确测量应用程序的每个方法花费的时间。 应用程序会定期暂停,每个活动线程上都会运行堆栈跟踪。 “检测详细信息”区域中的每一行会显示所遵循的执行路径。

如下面的屏幕截图所示,绘图图表显示应用在运行时收到的样本数:

  • 调用树 – 显示在每个方法中花费的时间:

周期

通过使用 C# 和 F# 托管代码,创建对永远不会被处置的对象的引用是很常见的,遗憾的是,这也是很容易的。 借助此工具,可以查明这些对象,并显示应用程序中引用的周期。

分析应用程序

目前,只能分析默认的调试配置。

如果分析任何使用其他配置的应用,则将显示以下消息对话框:

选择“更新”以继续。

SGen 垃圾回收器和分析

SGen 垃圾回收器用于所有 Xamarin 平台。

SGen 是一种分代 GC,它将应用程序的对象分配到三个堆中 - 新生代区、主要堆和大型对象空间中。 这样可以加快垃圾回收的执行速度。 SGen 目前是 Xamarin.Android 和 Xamarin.iOS 统一应用程序的默认 GC。

使用 Classic API 的 Xamarin.iOS 应用程序使用 Boehm GC,一种保守的非分代垃圾回收器。 因为它较为保守,所以不太可能会释放可用内存,这可能会导致使用探查器时的结果不准确。 因此,分配工具不能与 Boehm 垃圾回收器一起使用。

如果你的应用使用 Boehm GC,系统会提示一个消息对话框,但 Xamarin 不建议在不仔细研究和全面测试的情况下将使用 Boehm 的现有 iOS 应用程序切换到 SGen。 Xamarin 也不建议切换到 SGen 进行分析,然后再切换回来,因为这些结果不会提供内存使用情况的准确基准。

有关内存管理的详细信息,请参阅“内存和性能最佳做法”指南。

总结

在本指南中,我们了解了什么是分析,以及它对开发人员有什么好处。 然后我们介绍了 Xamarin Profiler,为它的工作原理提供一些历史和信息。 最后,我们浏览了 Xamarin Profiler 的功能,并探索了“分配”和“时间探查器”工具。