返回

进一步了解 Jetpack Compose 编译指标(下)

Android

Jetpack Compose 应用编译性能指标(下)

我们已经在上一篇文章中介绍了如何诊断应用的启动时间问题。

现在,让我们通过更详细地研究在 Compose 应用中编译产生的指标来了解更多内容。

复合函数编译时间(Composite Function Compile Time)

复合函数的编译时间是组件函数或可组合函数编译所需的时间,包括编译函数的主体和函数内部调用的所有子函数。

根据子函数的具体情况,从需要 2 毫秒到 15 毫秒都是合理的。

复合函数编译时间的统计数据可以帮助您确定哪些组件或可组合函数需要更多时间进行编译,从而找到优化目标。

通过字节码调试进行分析

您可以通过使用「字节码调试」工具来分析复合函数的编译时间。

以下步骤介绍了如何使用该工具:

  1. 按照以下步骤在您的计算机上安装「字节码调试」工具。
brew install bcj
  1. 在 Gradle 构建脚本的 app 模块的 android 块中添加以下配置。
android {
    buildTypes {
        debug {
            externalNativeBuild {
                cmake {
                    arguments "-DBytecodeDebuggingEnabled=1"
                }
            }
        }
    }
}
  1. 重新构建并运行您的应用程序。

  2. 连接到正在运行的应用程序并打开「字节码调试」工具。

  3. 使用「字节码调试」工具的「函数」选项卡来查看函数的列表。

  4. 找到您想要分析的复合函数并单击它。

  5. 在「统计信息」选项卡中,您可以看到有关复合函数的编译时间的统计数据。

识别并优化热函数

复合函数编译时间是指编译函数主体的耗时加上内部子函数的耗时。

有些函数可能经常被调用,我们称之为「热函数」。对于这样的函数,其耗时会显着影响应用的整体启动时间。

为了优化热函数,您可以尝试以下几种方法:

  • 将函数划分为更小的子函数。
  • 避免在函数内部进行不必要的操作。
  • 使用缓存来避免重复计算。
  • 使用内置的 Compose 函数来提高性能。

减少依赖以缩短依赖项链路长度

依赖项链路长度是指函数调用图中从根函数到叶函数的函数数量。

依赖项链路长度越长,编译时间就越长。

为了减少依赖项链路长度,您可以尝试以下几种方法:

  • 将函数划分为更小的子函数。
  • 避免在函数内部进行不必要的操作。
  • 使用缓存来避免重复计算。
  • 使用内置的 Compose 函数来提高性能。

其它可能的指标

  • 对于可组合函数来说,调用路径越短越好。调用路径是可组合函数从父组合函数被调用的路径。调用路径越短,可组合函数被编译的次数就越少。
  • 对于组合函数来说,调用次数越少越好。调用次数是组合函数被其父函数调用的次数。调用次数越少,组合函数被编译的次数就越少。
  • Compose 函数如果具有可变或不定长的参数,则编译时间会更长。例如,Text 函数如果接受可变参数,那么它会在每次调用时重新编译。
  • 在 Compose 函数内部使用临时变量也会增加编译时间。
  • 对 Compose 函数的参数进行不必要的检查也会增加编译时间。
  • 在 Compose 函数内部使用扩展函数也会增加编译时间。