【问题标题】:JIT vs AOT CompilingJIT 与 AOT 编译
【发布时间】:2023-04-02 11:00:01
【问题描述】:

这个问题与android系统有关。 Dalvik VM 使用 JIT 概念,这意味着当您第一次运行应用程序时 Dalvik VM 会对其进行编译并加载到 RAM只要它能留在那里。我理解这个概念。但是名为ART的新虚拟机使用AOT方法。 ART 会在您安装后(或在安装时?)编译应用程序。这是什么意思? ART 编译的应用程序与已编译的应用程序(如 C 应用程序)相同,但运行在与操作系统其余部分分开的单独进程中? 有人可以更彻底地向我解释这个概念吗?我必须做一些演示,这里提到了,但我不明白这个概念,如果有人问我一些关于这个的问题,我不想看起来很愚蠢:) 抱歉英语不好,如果有人可以稍微编辑问题会很好。

【问题讨论】:

    标签: android compilation jit


    【解决方案1】:

    我并不完全熟悉 Android 上的 Dalvik JIT 在实践中是如何工作的,因为 JIT 有多种工作方式可供选择。

    第一个选项是,JIT 在应用程序启动时将所有字节码转换为 CPU 指令。此选项在应用程序启动之前以及之后该应用程序可以作为本机运行之前花费了一些时间。问题是,翻译后的应用程序必须在启动期间保存在内存中,这不好。

    第二个选项是,JIT 作为真正的 Just-In-Time 工作,这意味着在即将启动时翻译代码块。整个应用程序在启动时不翻译,但只有主函数在启动时翻译,然后在运行期间翻译,当使用某些代码块(函数等)时。此选项消耗的内存较少,但应用程序在运行期间要慢得多。

    根据我找到的信息,Android 使用第一个选项。应用程序在启动时被翻译,之后它“几乎”本机运行。而这个“几乎”是 JIT 和 AOT 之间的主要区别。

    当您即将启动某个应用程序时,JIT 仅有有限的时间将所有字节码编译为 CPU 指令以使启动延迟“可接受”长。这意味着,它只能执行基本的优化。但是,当您安装某些应用程序时,您通常会浪费更多时间,而且您只执行一次 - 不是每次启动时。这意味着 AOT 编译器有更多的时间来寻找优化该应用程序的技巧。结果代码应该更“高效”。第二个好处是,编译后的应用程序存储在缓存中,并且只有一部分可以在启动时加载到内存中。这意味着操作系统没有将整个代码保存在内存中并且可以保存它。这就是主要区别。

    您问题的最后一部分 - Android 上的 ART 将在安装时执行编译(在将 apk 保存到 /data/app/ 之后)。但是,如果您擦除该缓存,或从 Dalvik 切换到 ART,它将在首次启动时编译所有已安装的应用程序,这可能需要 10 分钟甚至更长时间。

    也很抱歉我的英语不好,我是捷克人:-)

    【讨论】:

    • 我不了解 ART。所有应用程序都被编译并保存到缓存中,对吗?然后它们在本地运行?
    • 只是不要尝试像完全不同的东西那样启动 AOT(如 Art)和 JIT(如 Dalvik)。它们真的非常相似。 AOT/JIT 主要是某些编译器行为的名称。在某些时候,可以像设置中的选项一样选择 ART/JIT 行为(这不是 Art/Dalvik 的情况,但那里有数百个编译器)。 AOT 和 JIT 编译器可以毫无问题地共享 95% 的核心代码。但是,两者都可以有其特定的优化,这两种行为之间不可互换,但优化是可选的。这不是使他们与众不同的事情
    • AOT 编译是当今大多数应用程序的编译方式。 Delphi、C++、C#等使用这种编译。这完全是一回事。但是在 android 上,应用程序不是通过源代码共享的,而是通过预编译的字节码共享的。它介于源代码和本机应用程序之间。关键字、变量等被转换为符号字节,不相关的冗余信息被删除(空格、变量名,有时甚至是类/函数名)。这使得字节码比源代码小得多,并且更改它更加困难,因为可读性...
    • ... 受到剥离 cmets、变量名等的负面影响。启动或编译字节码比解释源代码要快得多。 PHP 等语言也在启动前将源代码转换为字节码(如果您有兴趣,它被称为 Zend Engine 2 OpCode)。回到你的问题...... AOT 和 JIT 没有使用解释方法,这意味着两者都必须发出本机代码。主要区别在于何时生成此代码(运行时之前或期间的 JIT)并且 JIT 有一些开销,因为它通常在应用程序运行期间运行并分析/编译它......
    • 是的,AOT 将所有应用程序编译为本机代码并将本机代码保存在缓存中。这个原生代码通常更大(Google 说大约 10-20% 是 Dalvik 使用的缓存字节码)。
    猜你喜欢
    • 2017-05-17
    • 2019-09-13
    • 2017-06-18
    • 2017-03-13
    • 1970-01-01
    • 2019-03-01
    • 2018-01-23
    • 2018-09-23
    • 2018-02-15
    相关资源
    最近更新 更多