优化和性能
原生镜像提供不同的机制,使用户能够在性能、文件大小、构建时间、可调试性和其他指标方面优化生成的二进制文件。
优化级别 #
与 gcc
和 clang
类似,用户可以使用 -O
选项控制优化级别。默认情况下,使用 -O2
,它旨在在性能、文件大小和构建时间之间取得良好的平衡。下表概述了不同的优化级别,并解释了它们在何时有用
级别 | 优化 | 用例 |
---|---|---|
-Ob |
减少 | 快速构建模式:通过避免耗时的优化来加快开发过程中的构建速度。这有时也可以减小文件大小。 |
-Os |
减少 | 为大小优化:-Os 启用所有 -O2 优化,除了那些可能显着增加代码或镜像大小的优化。通常以降低性能为代价创建最小的镜像。 |
-O0 |
无 | 通常与 -g 一起使用以改善调试体验。 |
-O1 |
基本 | 以牺牲性能为代价换取更小的文件大小和更快的构建时间。Oracle GraalVM 的 -O1 在某种程度上与 GraalVM 社区版的 -O2 相当。 |
-O2 |
高级 | 默认: 旨在以合理的文件大小获得良好的性能。 |
-O3 |
全部 | 旨在以更长的构建时间为代价获得最佳性能。Oracle GraalVM 自动用于 PGO 构建(--pgo 选项)。在 GraalVM 社区版中,-O3 和 -O2 是相同的。 |
配置文件引导优化以提高吞吐量 #
考虑使用配置文件引导优化来优化应用程序以提高吞吐量。这些优化允许 Graal 编译器利用配置文件信息,类似于它作为 JIT 编译器运行时,在对应用程序进行 AOT 编译时。为此,请执行以下步骤
- 使用
--pgo-instrument
构建您的应用程序。 - 使用代表性工作负载运行您的工具化应用程序以生成配置文件信息。默认情况下,从此运行收集的配置文件存储在 default.iprof 文件中。
- 使用
--pgo
选项重建您的应用程序。您可以使用--pgo=<your>.iprof
传递自定义 .iprof 文件,否则将使用 default.iprof。这将重建您的镜像并生成应用程序的优化版本。
在 配置文件引导优化的基本用法 中查找有关此主题的更多信息。
针对特定机器优化 #
原生镜像提供一个 -march
选项,它的作用类似于 gcc
和 clang
中的选项:它允许用户控制 Graal 编译器在将代码编译为原生代码时可以使用的一组指令。默认情况下,原生镜像在 x64 上使用 x86-64-v3
,在 AArch64 上使用 armv8-a
。使用 -march=list
列出所有可用的机器类型。如果生成的二进制文件是在与部署的二进制文件相同或相似的机器类型上构建的,请使用 -march=native
。此选项指示编译器使用它在生成二进制文件的机器上找到的所有可用指令。另一方面,如果生成的二进制文件被分发给许多不同的用户,并且可能非常旧的机器,请使用 -march=compatibility
。这将编译器使用的指令集减少到最少,从而提高生成的二进制文件的兼容性。
附加功能 #
原生镜像提供附加功能以进一步优化生成的二进制文件
- 选择合适的垃圾收集器并调整垃圾收集策略可以减少 GC 时间。请参阅 内存管理。
- 在镜像构建期间加载应用程序配置可以加快应用程序启动速度。请参阅 镜像构建时的类初始化。
- 构建输出可能会提供一些其他建议,帮助您充分利用原生镜像。请参阅 构建输出:建议。