`
1927105
  • 浏览: 150427 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

JIT(即时编译)

 
阅读更多

本文转自eoeandroid

最早的Java建置方案是由一套转译程式(interpreter),将每个Java指令都转译成对等的微处理器指令,并根据转译后的指令先后次序依序执行,由于一个Java指令可能被转译成十几或数十几个对等的微处理器指令,这种模式执行的速度相当缓慢。
针对这个问题,业界首先开发出JIT(just in time)编译器 。当Java执行runtime环境时,每遇到 一个新的类别(class:类别是Java程式中的功能群组),类别是Java程式中的功能群组-JIT编译器在此时就会针对这个类别进行编译(compile)作业。经过编译后的程式,被优化成相当精简的原生型指令码(nativecode) ,这种程式的执行速度相当快。花费少许的编译时间来节省稍后相当长的执行时间,JIT这种设计的确增加不少效率,但是它并未达到最顶尖的效能,因为某些极少执行到的Java指令在编译时所额外花费的时间可能比转译器在执行时的时间还长,针对这些指令而言,整体花费的时间并没有减少。

基于对JIT的经验,业界发展出动态编译器(dynamic compiler) ,动态编译器仅针对较常被执行的程式码进行编译,其余部分仍使用转译程式来执行。也就是说,动态编译器会研判是否要编译每个类别。动态编译器拥有两项利器:一是转译器,另一则是JIT,它透过智慧机制针对每个类别进行分析,然后决定使用这两种利器的哪一种来达到最佳化的效果。动态编译器针对程式的特性或者是让程式执行几个循环,再根据结果决定是否编译这段程式码。这个决定不见得绝对正确,但从统计数字来看,这个判断的机制正确的机会相当高。事实上,动态编译器会根据「历史资料」做决策,所以程式执行的时间愈长,判断正确的机率就愈高。以整个结果来看,动态编译器产生的程式码执行的速度超越以前的JIT技术,平均速度可提高至50%。
即时编译(Just-in-time Compilation,JIT),又称动态转译(Dynamic Translation) ,是一种通过在运行时将字节码翻译为机器码,从而改善字节码编译语言性能的技术。即时编译前期的两个运行时理论是字节码编译和动态编译。
在编译为字节码的系统如 Limb 编程语言,Smalltalk,UCSD P-System, Perl,GNU CLISP,和 Java 的早期版本中, 源代码被翻译为一种中间表示即字节码。 字节码不是任何特定计算机的机器码, 它可以在多种计算机体系中移植。 字节码被解释着运行在虚拟机里。
动态编译环境是一种在执行时使用编译器的编译环境。 例如, 多数 Common Lisp 系统有一个编译函数,他可以编译在运行时创建的函数。
在即时编译环境下, 字节码的编译是第一步, 它将源代码递归到可移植和可优化的中间表示。字节码被部署到目标系统。 当执行代码时,运行时环境的编译器将字节码翻译为本地机器码。 基于每个文件或每个函数:函数仅仅在他们要被执行时才会被编译。
目标是要组合利用本地和字节码编译的多种优势:多数重量级的任务如源代码解析和基本性能的优化在编译时处理,将字节码编译为机器码比起从源代码编译为机器码要快得多。部署字节码是可移植的,而机器码只限于特定的系统结构。从字节码到机器码编译器的实现更容易,因为大部分工作已经在实现字节码编译器时完成。
好,说白了,JIT 在Android方面其实现实际上是在 Dalvik vm这一层,与内核是分离的,直观的表现就是几个库文件。
然后,JIT到底能提升机器多大的性能?我也不知道——不要跟我说Linpack跑多少分,学计算机的都知道,Linpack只是一个基准测试程序,测试的是机器的浮点计算能力、向量性能和高速缓存性能。Linpack只是众多基准测试的一种,它的分数代表不了任何东西。它只有一个局部的计算性能参考
然后,为什么使用了JIT之后,Linpack的分数就能提高很多?OK,看Linpack是干什么的——有一项是测试高速缓存的,那么,使用JIT之后,一部分Dalvik的字节码(apk程序包的逻辑部分,如*.dex和*.odex)会被转译成手机CPU的指令代码,那好,这部分代码就可以进行重用,减少了编译的时间,这就相当于一个“缓存”,使得访问Dalvik字节码的次数大大降低,也就是减少了解释执行字节码的次数。要知道,解释执行字节码的速度是比较慢的,所以直接体现就是Linpack分数的提高。
那么,JIT对我们使用的影响大么?
准确的说,有,但不是很大,根本达不到Froyo 2.2宣传的那样(我恨IT媒体)几倍的提升。为什么?因为我们用的系统不光有逻辑(程序执行),还有UI(图形渲染),以及其他很多因素(线程调度、I/O等等),单独的JIT技术只是提高了程序代码的执行效率(还不是全部),并未对系统有全局优化的功效。如果可以的话,可以针对Linpack专门设计一个优化的虚拟机,让G2这样的机器跑到30分也是没问题的。但是实际使用的体验不会好很多

分享到:
评论

相关推荐

    如何提高MATLAB运行效率.doc

    为了提高MATLAB的运行效率,我们需要从多方面入手,包括 JIT 即时编译技术、向量化、Inplace Operation 等。 首先,让我们来谈谈 JIT 即时编译技术。MATLAB 在第一次加载运行一个函数的时候,会在后台对它进行某种...

    易语言面向对象的脚本引擎 支持重写 继承 多态

    闭包功能添加了 但是我没有测试。。。里面包含两种语法分析模式 parser... 应该是易语言写的最快的脚本引擎了 还没有添加jit即时编译功能(直接编译为字节码运行) 添加之后会更快 以后将会优化变量读写 。 @无间酱。

    cpp-Euboea一种超快速和微小的编程语言将JIT编译为机器码

    它通过即时(Just-In-Time, JIT)编译技术将源代码直接转化为机器码,这一特性使得Euboea在运行时能够获得接近原生代码的性能。JIT编译是一种动态编译技术,它在程序运行时对部分或全部源代码进行编译,而非在程序...

    cpp-NativeJIT开源跨平台高性能即时编译表达式包括C的数据结构

    NativeJIT是一个开源项目,旨在提供一个跨平台的高性能即时编译(JIT)库,特别关注于C++中的数学表达式和数据结构的优化编译。这个库允许开发者将数学表达式直接编译为机器码,从而在运行时实现快速计算,尤其适用...

    深入JVM系列-JIT编译详解1

    JIT(Just In Time)编译器是一种即时编译技术,它可以加速Java程序的执行速度。 JIT编译过程 -------- 在执行Java程序时,JVM会将字节码编译成本机机器码,并进行多层次的优化。这个过程可以分为两个阶段:解释...

    深入JVM即时编译器JIT,优化Java编译

    Java即时编译器(JIT,Just-In-Time ...总之,深入理解JVM的即时编译机制对于Java开发者来说非常重要,它可以帮助我们更好地优化代码,实现更高的运行效率,同时也能在遇到线上问题时,更准确地定位和解决问题。

    一个速度奇快的 JSON 序列化/反序列化库,由 JIT (即时编译)和 SIMD (单指令流多数据流)加速

    一个速度奇快的 JSON 序列化/反序列化库,由 JIT (即时编译)和 SIMD (单指令流多数据流)加速。运行时对象绑定,无需代码生成。完备的 JSON 操作 API。对于所有大小的 json 和所有使用场景, Sonic 表现均为最佳...

    svelte-tailwind-jit-vite:Vite上带有Tailwind JIT编译器的Svelte App入门模板

    在Vite上使用即时TailwindCSS编译器快速搭建Svelte应用程序。 安装 npx degit reepolee/svelte-tailwind-jit-vite#main svelte-app cd svelte-app npm i npm run dev -- --open 享受最好的开发人员体验。 学分

    最新java面试专题01-JVM

    ### 最新Java面试专题01-JVM...通过对JVM内存结构、生命周期、垃圾收集机制、类加载机制以及JIT即时编译等方面的学习,不仅可以提升个人技术能力,还能在实际工作中解决复杂的技术问题,提高软件系统的性能和稳定性。

    对用户交互响应进行加速的即时编译技术.pdf

    对用户交互响应进行加速的即时编译技术 对用户交互响应进行加速的即时编译技术是指在用户交互过程中,如何通过即时编译技术来提高响应速度的技术。传统的即时编译器存在无法准确选取和加速瓶颈代码段的缺陷,影响了...

    C#中堆和栈的区别分析

    当一个方法被调用时,主线程会在所属程序集的元数据中查找被调用方法,然后通过 JIT 即时编译并把结果放在栈顶。CPU 通过总线从栈顶取指令,驱动程序以执行下去。 四、生命周期和垃圾回收机制 栈上的元素在方法...

    jitcc:用于C / C ++程序的即时编译工具-开源

    **即时编译(JIT)技术** 即时编译器(Just-In-Time Compiler,简称JIT)是一种编程技术,它在程序运行时将源代码或字节码转换为机器码,从而提高了程序的执行效率。与传统的静态编译器不同,JIT编译器能够根据程序...

    hsdis工具,hotspot虚拟机插件,反汇编jit编译代码

    解释器会首先执行字节码,然后根据执行频率和复杂性选择将热点代码编译为本地机器码,这就是所谓的“热点探测”和“即时编译”。这种策略能够在不牺牲启动速度的情况下,显著提升运行时的性能。 在JDK 1.8中,...

    21丨深入JVM即时编译器JIT,优化Java编译.html

    21丨深入JVM即时编译器JIT,优化Java编译.html

    Learning.NETHighperformanceProgramming-英文原版.zip

    4. **代码优化技巧**:探讨编译器优化,如JIT即时编译和AOT预编译。学习如何编写高效的循环、避免 boxing 和 unboxing,以及何时使用 unsafe 代码和指针操作。 5. **数据库性能**:讨论如何优化ADO.NET访问数据库的...

    最优化理论

    8. **内建优化工具**:C#编译器本身支持一些优化,如JIT即时编译、编译优化开关等,可以自动优化代码运行效率。开发者还可以通过理解并利用这些工具提高程序性能。 9. **并发和并行优化**:在多核处理器时代,合理...

    ThinkPHP项目开发PHP实战_留言板_编程案例解析实例详解课程教程.pdf

    PHP8进一步优化了语法和性能,包括更严格的变量判断和JIT即时编译。 ThinkPHP是中国的一个流行的PHP框架,旨在简化Web应用程序的开发。它提供了丰富的工具和功能,如MVC模式、自动路由、数据库操作、缓存管理等,...

    luajit.exe 编译lua jit脚本 XP可运行版。

    LuaJIT,全称为Lua Just-In-Time Compiler,是Lua语言的一个高效实现,它通过即时编译(JIT)技术显著提升了Lua代码的执行效率。在本文中,我们将深入探讨如何在Windows XP系统下,使用Visual Studio 2010命令行工具...

    11丨即时编译:高性能JVM的核心秘密1

    Java即时编译(JIT,Just-In-Time Compilation)是高性能JVM的关键技术之一。与静态编译,如C++编译器将源代码一次性转换为机器码不同,JIT编译器在程序运行期间分析代码并将其部分转换为优化过的本地机器码。这样做...

    Java程序性能优化之二十三个建议

    22. **使用Java编译器优化**:如JIT即时编译,可以将热点代码编译成机器码,提高运行效率。 23. **代码重构**:通过重构改进代码结构,提高可读性和维护性,间接提升性能。 以上是基于标题和描述推测的优化建议,...

Global site tag (gtag.js) - Google Analytics