为什么在服务器应用程序中使用 Dart 时 JIT 和 AOT 具有相同的性能?

Why JIT & AOT has same performance when using Dart in server app?

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

任何想测试的人都可以使用这个 repo

AOT 会更小(您可以跳过完整的 SDK)并且启动速度更快 – 没有 JIT。

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

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

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

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

你忘记了:‘dart compile jit-snapshot’

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

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

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

JIT 和 AOT 各有优缺点。

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

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

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

这是 AOT 和 JIT 之间的基本比较。现实更加复杂和微妙。在纸面上,JIT 几乎总是 peak 性能更好,但今天并非完全如此。它高度依赖于特定代码 - 它是否会在 AOT 或 JIT 中更快 运行。

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

希望这能解释情况。我将查看您的示例并针对特定测试用例提供更深入的响应 - 但这需要一些时间。