美文网首页
JIT(just-in-time)原理

JIT(just-in-time)原理

作者: sarah_wqq | 来源:发表于2019-01-24 11:56 被阅读0次

原理

对于解释性语言(如JS、Python)来说,解释器将代码一行行得翻译为机器语言,边翻译边执行。而对于编译性语言(C/C++/Java)来说,编译器提前对所有代码进行编译和优化,后续执行程序的时候直接运行机器代码即可,所以编译性语言的执行效率大大高于解释性语言。
解释器运行同样的代码一次以上的时候,比如执行一个循环,解释器不得不一次又一次的进行翻译,效率非常低下。

JIT(即时编译)可以解决一部分反复翻译的问题

在 JavaScript 引擎中增加一个监视器监控着代码的运行情况,记录代码一共运行了多少次、如何运行的等信息。如果同一行代码运行了多次,这个代码段就会被送给JIT机制进行编译和优化,将编译后的机器代码保存在缓存中,下次直接执行这块机器代码即可,大大提高了一些情况下代码的执行效率。

V8引擎中使用

V8有两个编译器

  • full-codegen:一个简单而且速度非常快的编译器,可以生成简单且相对较慢的机器代码。
  • Crankshaft:JIT的优化编译器,可以生成高度优化的代码。

V8引擎还在内部使用多个线程

  • 主线程完成预定的任务:获取你的代码,编译它然后执行它
  • 一个单独的线程用于编译,当这个单独的线程优化代码时,主线程可以继续执行
  • 一个Profiler线程,它会告诉运行时我们花了很多时间,使得Crankshaft能够优化它们
  • 一些线程处理垃圾处理器扫描

当第一次执行JavaScript代码时,V8利用full-codegen,直接将解析的JavaScript翻译成机器代码而无需任何转换。当代码运行一段时间后,Profiler线程已经收集了足够的数据以确定哪种方法应该进行优化。接下来,Crankshaft从另一个线程开始对代码优化和缓存。

优化方法:

  • 类型限定 (每次动态判断类型太耗时)
  • 调用函数内联化
  • 隐藏类(每次遍历查找类的属性太低效)
  • 机器码缓存(将反复执行的代码翻译为机器码存在内存中,如循环递归等函数)

WebAssembly中使用

WebAssembly是一种新的字节码格式,缩写是"wasm", .wasm 为文件名后缀,是一种新的底层安全的二进制语法。
WebAssembly不算一种一门编程语言,而是一种编译机制,很多浏览器都支持WebAssembly,对WebAssembly格式的解码速度要快得多得多得多。

Python中使用

PyPy可以提供JIT。

相关文章

网友评论

      本文标题:JIT(just-in-time)原理

      本文链接:https://www.haomeiwen.com/subject/vmdyjqtx.html