在 Flutter 应用程序中,运行应用程序时 JIT 和 AOT 编译之间存在很大差异,但在服务器应用程序中,差异很小,有时 AOT 模式比 JIT 慢。为什么会这样?这是否意味着服务器应用程序的飞镖在 AOT 模式下没有进行太多优化?在哪种情况下使用 JIT 模式好?
对于任何想要测试的人,您都可以使用这个repo
在 Flutter 应用程序中,运行应用程序时 JIT 和 AOT 编译之间存在很大差异,但在服务器应用程序中,差异很小,有时 AOT 模式比 JIT 慢。为什么会这样?这是否意味着服务器应用程序的飞镖在 AOT 模式下没有进行太多优化?在哪种情况下使用 JIT 模式好?
对于任何想要测试的人,您都可以使用这个repo
我领导 Dart 原生运行时编译管道开发。凯文的回答很好,但我想在这里添加更多颜色。
Flutter 社区普遍认为调试Flutter 模式很慢,因为 JIT 和release,这并不完全正确。实际上,Flutter 框架充满了大量非常缓慢的一致性检查/断言,这些检查/断言仅在调试模式下启用。这就是大部分缓慢的来源。禁用这些断言将使这种比较更加苹果对苹果。
JIT 和 AOT 各有优劣。
AOT 非常适合 UI,因为 UI 不能容忍 JIT 的不可预测性和预热时间。
JIT 适用于批处理模式代码。
这是 AOT 和 JIT 之间的基本比较。现实更加复杂和微妙。在纸面上,JIT 应该几乎总是能提高峰值性能,但今天这并不完全正确。它高度依赖于特定的代码——它是否会在 AOT 或 JIT 中运行得更快。
事实上,我们已经有一段时间忽略了 JIT 性能,把时间花在了 AOT 性能和代码大小上。有些事情(比如调用)在 AOT 中比 JIT 快得多。
希望这能解释风景。我将看一下您的示例,并为特定的测试用例提供更深入的响应——但这需要一些时间。
AOT 会更小(你可以跳过完整的 SDK)并且启动更快——没有 JIT。
一个有趣的细节:对于长时间运行的进程,JIT 可能总是更快,因为 JIT 编译器会随着时间的推移使用有关进程如何执行的信息来优化代码。
AOT 编译器根据磁盘上代码的详细信息进行最佳猜测优化,但没有运行时信息。
对于需要快速冷启动且可能不会运行很长时间的无服务器或微服务,我们建议使用 AOT 模型。
如果您有长时间运行的服务,或者您真正关心最大可能性能(不太关心启动时间或部署大小),您可能希望坚持使用 JIT。
你忘了:'dart compile jit-snapshot'</p>