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

Mha*_*mad 3 dart dart-server

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

对于任何想要测试的人都可以使用这个存储库

Vya*_*rov 10

我领导 Dart 本机运行时编译管道的开发。凯文的回答非常好,但我想在这里添加更多色彩。

Flutter 社区的普遍看法是, Flutter 的debug模式因为 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 快得多。

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


Kev*_*ore 7

AOT 会更小(您可以跳过完整的 SDK)并且启动速度更快 \xe2\x80\x93\xc2\xa0no JIT。

\n

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

\n

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

\n

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

\n

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

\n