2

在 Flutter 应用程序中,运行应用程序时 JIT 和 AOT 编译之间存在很大差异,但在服务器应用程序中,差异很小,有时 AOT 模式比 JIT 慢。为什么会这样?这是否意味着服务器应用程序的飞镖在 AOT 模式下没有进行太多优化?在哪种情况下使用 JIT 模式好?

对于任何想要测试的人,您都可以使用这个repo

4

3 回答 3

6

我领导 Dart 原生运行时编译管道开发。凯文的回答很好,但我想在这里添加更多颜色。

Flutter 社区普遍认为调试Flutter 模式很慢,因为 JIT 和release,这并不完全正确。实际上,Flutter 框架充满了大量非常缓慢的一致性检查/断言,这些检查/断言仅在调试模式下启用。这就是大部分缓慢的来源。禁用这些断言将使这种比较更加苹果对苹果。

JIT 和 AOT 各有优劣。

  • AOT 的特点是启动速度非常快,无需预热即可达到最佳性能。AOT 应用程序使用较少的内存。另一方面,AOT 编译器无法访问运行时分析数据,因此必须做出保守的假设。
  • 在 JIT 模式下,应用程序需要更长的时间才能启动,并且需要预热才能达到最佳性能。JIT 应用程序使用更多内存(JIT 自身的开销)。然而,JIT 也可以访问运行时分析数据,这使得它可以更积极、更具体地进行优化——这可以让它达到更高的峰值性能。

AOT 非常适合 UI,因为 UI 不能容忍 JIT 的不可预测性和预热时间。

JIT 适用于批处理模式代码。

这是 AOT 和 JIT 之间的基本比较。现实更加复杂和微妙。在纸面上,JIT 应该几乎总是能提高峰值性能,但今天这并不完全正确。它高度依赖于特定的代码——它是否会在 AOT 或 JIT 中运行得更快。

事实上,我们已经有一段时间忽略了 JIT 性能,把时间花在了 AOT 性能和代码大小上。有些事情(比如调用)在 AOT 中比 JIT 快得多。

希望这能解释风景。我将看一下您的示例,并为特定的测试用例提供更深入的响应——但这需要一些时间。

于 2022-01-20T09:18:15.803 回答
5

AOT 会更小(你可以跳过完整的 SDK)并且启动更快——没有 JIT。

一个有趣的细节:对于长时间运行的进程,JIT 可能总是更快,因为 JIT 编译器会随着时间的推移使用有关进程如何执行的信息来优化代码。

AOT 编译器根据磁盘上代码的详细信息进行最佳猜测优化,但没有运行时信息。

对于需要快速冷启动且可能不会运行很长时间的无服务器或微服务,我们建议使用 AOT 模型。

如果您有长时间运行的服务,或者您真正关心最大可能性能(不太关心启动时间或部署大小),您可能希望坚持使用 JIT。

于 2022-01-20T00:08:48.800 回答
1

你忘了:'dart compile jit-snapshot'</p>

https://dart.dev/tools/dart-compile

于 2022-01-20T07:46:11.503 回答