使用 LCOV 理解 PGO 报告

您将学习如何使用基于 LCOV 的工具来分析 PGO 配置文件。

配置文件引导优化 (PGO) 可帮助您最大限度地提高原生应用程序的性能。作为 PGO 过程的一部分,您将创建一个带插桩的二进制文件,并在其上运行工作负载以生成 PGO 配置文件,然后您可以将其反馈到构建过程中以生成应用程序的优化二进制文件。通常,您无需了解此类 PGO 配置文件的内容。但是,在某些情况下,您可能希望了解配置文件中记录的内容,尤其是在优化二进制文件的性能出现问题时。GraalVM 原生镜像可以将配置文件信息导出到 LCOV 格式 的附加文件中。您可以在支持 LCOV 格式的任何 IDE 或工具中打开和可视化此类文件。这使您可以查看代码中的哪些方法被调用以及调用的次数。

Graal 编译器在优化热方法(被多次调用的方法)上花费的时间比优化冷方法(只被调用几次或根本没有被调用的方法)花费的时间更多。因此,您可以使用附加的 LCOV 导出文件来检查在带插桩的二进制文件上运行的工作负载实际调用了哪些方法。这也意味着 PGO 配置文件包含这些方法的适当配置文件信息。此外,覆盖率可视化有助于您识别应用程序的热方法,同样是针对在带插桩的二进制文件上运行的工作负载。如果您想最大限度地提高性能,这些通常是您需要仔细查看的方法。相反,完全没有覆盖的方法是进行清理的潜在候选方法,这反过来可以加快构建时间。

创建覆盖率报告 #

要创建覆盖率报告,首先需要在构建带插桩的二进制文件时传递-H:+ProfilingLCOV 实验选项以及--pgo-instrument 选项。例如

native-image -cp . GameOfLife -o gameoflife-instrumented --pgo-instrument -H:+UnlockExperimentalVMOptions -H:+ProfilingLCOV -H:-UnlockExperimentalVMOptions

在运行带插桩的应用程序后,该报告将以.info 跟踪文件形式生成,以及配置文件一起。与配置文件类似,还可以使用-XX:ProfilesLCOVTraceFile 选项自定义生成的信息文件的目标位置。例如

./gameoflife-instrumented -XX:ProfilesLCOVTraceFile=gameoflife-coverage.info

生成的 LCOV 跟踪文件提供了方法级别的覆盖率信息,即特定方法是否执行(以及执行了多少次),或者没有执行。可以使用lcov 命令轻松地汇总这些信息(参见 官方 LCOV 手册页)。例如

lcov --summary gameoflife-coverage.info

这会以以下格式输出简短摘要

Summary coverage rate:
  lines......: 17.3% (24873 of 144172 lines)
  functions..: 15.6% (2390 of 15285 functions)
  branches...: no data found

此外,要可视化数据,可以使用 genhtml 实用程序 从 LCOV 数据创建 HTML 报告,或者使用任何第三方 LCOV 数据可视化器(例如,LCOV 查看器项目)。

要显示哪些方法已插桩(已找到)以及哪些方法已执行(已命中),genhtml 还会使用源文件(如果不可用,也可以使用--synthesize-missing 选项省略)。此外,如果源文件位于特定目录中,--source-directory 选项非常有用。例如

genhtml --source-directory *absolute-path-to-sources* gameoflife-coverage.info

以下是从由上述命令生成的gameoflife-coverage.info 跟踪文件生成的报告中查看源文件示例

LCOV Genhtml Report - Source View

此外,functions 视图列出了特定源文件中找到的所有方法,以及它们的执行次数

LCOV Genhtml Report - Functions View

进一步阅读 #

联系我们