【问题标题】:What does a JIT compiler do?JIT 编译器有什么作用?
【发布时间】:2011-02-23 14:11:24
【问题描述】:

我刚刚在观看 Google IO 视频,他们谈到了他们在 android 中包含的 JIT 编译器。由于 JIT 编译器,他们展示了性能改进的演示。我想知道 JIT 编译器到底是做什么的,想听听不同的人的意见。

那么,JIT 编译器的职责是什么?

【问题讨论】:

标签: compiler-construction jit


【解决方案1】:

它是一个即时编译器,介于解释器和编译器之间(即它会编译,但只是在代码执行之前)。

这允许使用仅在运行时知道的动态信息对编译进行优化(因为编译器通常静态运行,因此只能访问编译时信息)。它们更难编写,但可以极大地提高性能。

如需更多信息,一如既往,see Wikipedia

在计算中,即时编译 (JIT) 也称为动态翻译,是一种提高计算机程序运行时性能的技术。传统上,计算机程序有两种运行时操作模式,解释或静态(提前)编译。解释代码在每次执行过程中不断地从高级语言翻译成机器码,而静态编译在执行前将代码翻译成机器码,只需要翻译一次。

JIT 编译器代表了一种混合方法,与解释器一样,翻译是连续发生的,但会缓存已翻译的代码以最大程度地减少性能下降。与开发时静态编译的代码相比,它还具有其他优势,例如处理后期绑定数据类型和强制执行安全保证的能力。

【讨论】:

    【解决方案2】:

    JIT 是“及时”的缩写。 JIT 编译器将通常使用 Java 字节码或 Microsoft IL 等中间语言的代码编译为本机可执行代码,并在调用代码时执行此操作。所以在代码被调用之前,它只存在于可移植的、非机器特定的字节码或 IL 中,然后当它被调用时,会生成原生代码(然后在后续调用中重复使用)。

    【讨论】:

      【解决方案3】:

      JIT = 及时。这是一个过程,在此过程中,原本会被解释的程序(例如 Java 字节码或 Javascript 代码)在运行时被即时转换为本机机器码以提高性能。

      其中一些好处是 JIT 编译器可以看到热点并应用更积极的优化,它还可以利用当前处理器的任何扩展,如 SSE2。

      这个问题可能有更多信息: How a JIT compiler helps performance of applications?

      【讨论】:

        【解决方案4】:

        那么,JIT 的职责是什么 编译器?

        正如其他人所说,它是“Just In Time”的缩写,在这个意义上意味着“Just in time for execution”。

        当您将程序编译为机器码时,它们通常针对某个平台。

        因此,JIT 是“发明的”,您想为执行平台编译代码的最后一点点,所以将其视为“执行前”-编译器/优化器。

        JIT 让我们的生活更轻松,并(希望)让我们的应用程序运行得更快。

        当然还有其他purposes of JIT-compilation,以上只是其中之一。

        【讨论】:

          【解决方案5】:

          JIT 编译器通常是 VM 管道的最后一部分,并从 VM 的中间语言生成机器代码。

          它通过针对运行环境(CPU 特定指令、缓存大小...)优化生成的代码来提高速度。

          传统编译器也会优化生成的机器代码,但他们必须在不知道运行时可用的特定资源的情况下这样做。

          【讨论】:

            【解决方案6】:

            Java 代码通常以字节码的形式分发,它是与机器无关的伪代码。 (同样的想法以前在 70 年代开发的 UCSD-p 系统 中使用。)这样做的好处是相同的应用程序可以在不同的处理器和操作系统中运行。此外,字节码通常小于已编译的应用程序。

            缺点是与运行编译代码相比,解释代码。 为了解决这个问题,开发了JIT 编译器。 JIT 编译器在代码执行之前将代码编译成机器码。与解释器相比,这加快了执行速度,但每次运行程序时都会花费额外的时间进行编译。 此外,由于 JIT 编译器必须快速编译,它不能使用静态编译器中使用的复杂优化技术。

            另一种方法是HotSpot 编译。它最初作为解释器运行,但随后会检测最常用的例程并仅编译那些例程。优点是没有由于编译而导致的初始延迟。此外,HotSpot 编译器可能会在执行过程中进行分析,然后对最重要的例程进行更强的优化。它甚至可以收集信息,这样当你一次又一次地运行同一个应用程序时,它会运行得越来越快。有关 HotSpot 编译的更多信息,请访问 this article(链接为 tnx Pangea)。

            当然,您可以使用静态编译器为您的机器编译字节码,而不是使用 JIT 编译器。这允许完全优化,然后您无需在每次运行应用程序时再次编译。但是,在手机和网页中,您通常只执行一次代码(或小程序),因此 JIT 编译器可能是更好的选择。

            更新

            Python 字节码文件的扩展名为 .py。当您执行字节码文件时,Python JIT 编译器会生成编译后的文件 .pyc。下次运行相同的程序时,如果 .py 文件没有改变,则无需再次编译,而是 Python 运行之前编译的 .pyc 文件。这加快了程序的启动速度。

            【讨论】:

            • @PauliL:如果 JIT 将字节码转换为机器可理解的格式,那么字节码如何独立于平台?
            • @ShardaPrasadJaiswal:字节码独立于平台。 JOT 编译器在您运行程序时将其编译为您计算机的本机代码。
            【解决方案7】:

            即时 (JIT) 编译器是 Java™ 运行时环境的一个组件,可提高 Java 应用程序在运行时的性能。

            请参阅 IBM 文档 here

            解释器基本上是这样做的:

            1. 读取下一个要执行的字节码
            2. 查看字节码是什么并找到与之对应的本机机器指令
            3. 执行本机机器指令
            4. 转到步骤 1

            这很简单,它运行良好,并且可以运行您的 Java 程序。但这也是低效的,因为为要执行的每个字节码查找本机指令会花费处理时间。所以 JVM 包含了第二种机制,即即时编译器,它基本上是这样做的:

            1. 读取需要执行的方法的所有字节码
            2. 将所有这些字节码转换为本机机器指令
            3. 执行生成的本机机器指令

            在将方法的字节码转换为本机机器指令后,JVM 会记住本机代码,以便下次必须运行该方法时,它可以简单地运行本机指令 - 它不需要每次运行该方法时转换字节码。这使程序运行得更快。

            此外,JIT 执行大量优化以生成尽可能快地运行的本机代码。

            【讨论】:

            • 这个问题已经有很多不错的答案了;不知道为什么需要复制和粘贴现有内容。
            • @AndrewBarber 我遇到了这个问题,发现没有明确提到 JIT 是解释器的一种替代方案。只有在做了更多的研究之后,我才对它有了一个清晰的认识。我只是为了帮助别人而发帖。特别是 IBM 文档非常有帮助。
            • 前三个答案中有两个对口译员的比较非常清楚。
            • @AniketThakur 附议。^
            【解决方案8】:

            很好的解释:

            “在实践中,方法在第一次调用时不会被编译。对于每个方法,JVM都会维护一个调用计数,每次调用该方法时递增。JVM解释一个方法,直到它被调用count 超过了 JIT 编译阈值。因此,经常使用的方法会在 JVM 启动后立即编译,而较少使用的方法则在更晚编译或根本不编译。JIT 编译阈值有助于 JVM 快速启动并且仍然具有改进的性能。阈值经过精心选择,以获得启动时间和长期性能之间的最佳平衡。

            编译方法后,其调用计数将重置为零,并且对该方法的后续调用继续增加其计数。当方法的调用计数达到 JIT 重新编译阈值时,JIT 编译器将对其进行第二次编译,应用比前一次编译更多的优化选择。重复此过程,直到达到最大优化级别。 Java 程序中最繁忙的方法总是得到最积极的优化,最大限度地提高使用 JIT 编译器的性能优势。 JIT 编译器还可以在运行时测量操作数据,并使用该数据来提高质量进一步重新编译。

            可以禁用 JIT 编译器,在这种情况下,将解释整个 Java 程序。不建议禁用 JIT 编译器,除非是为了诊断或解决 JIT 编译问题。"

            来源:https://www-01.ibm.com/support/knowledgecenter/SSYKE2_7.0.0/com.ibm.java.aix.71.doc/diag/understanding/jit_overview.html

            【讨论】:

              【解决方案9】:

              怀疑 先生,如果javac是一个Java编译器,它的作用是将源代码转换为字节码意味着.Class然后.class(字节码)由JVM解释Java解释器(Java)意味着JIT是JVM的一部分,那么它是什么实际工作

              【讨论】:

                猜你喜欢
                • 2010-09-10
                • 2010-10-16
                • 2020-06-20
                • 2018-01-23
                • 2016-09-19
                • 2019-03-01
                相关资源
                最近更新 更多