JavaScript深入V8引擎以及编写优化代码的5个技巧

  


  

  

JavaScript引擎是执行JavaScript代码的程序或解释器.JavaScript引擎可以实现为标准解释器,或者以某种形式将JavaScript编译为字节码的即时编译器。

  

以为实现JavaScript引擎的流行项目的列表:

  
      <李> <>强v8 # 8202; & # 8202;开源,由谷歌开发,用c++编写李   <李> <>强犀牛# 8202; & # 8202;由Mozilla基金会管理,开源,完全用Java开发   <李> <>强SpiderMonkey& # 8202; & # 8202;是第一个支持Netscape Navigator的JavaScript引擎,目前正供Firefox使用李   <李> <>强JavaScriptCore & # 8202;开源,以硝基形式销售,由苹果为Safari开发   <李> <>强kj & # 8202;& # 8202;KDE的引擎,最初由Harri Porten为KDE项目中的Konqueror网页浏览器开发   <李> <>强脉轮(JScript9) & # 8202;& # 8202;Internet Explorer李   <李> <>强脉轮(JavaScript) & # 8202; & # 8202;微软边缘李   <李> <>强Nashorn 强,作为OpenJDK的一部分,由甲骨文Java语言和工具组编写李   <李> <>强JerryScript& # 8202; & # 8202;物联网的轻量级引擎李   
  


  

  

由谷歌构建的V8引擎是开源的,使用c++编写。这个引擎是在谷歌Chrome中使用的,但是,与其他引擎不同的是V8也用于流行的node . js。

  

V8最初被设计用来提高网页浏览器中JavaScript执行的性能。为了获得速度,V8 JavaScript将代码转换成更高效的机器码,而不是使用解释器。它通过实现JIT(及时)编译器将JavaScript代码编译为执行时的机器码,就像许多现代JavaScript引擎(如SpiderMonkey或犀牛(Mozilla))所做的那样。这里的主要区别是V8不生成字节码或任何中间代码。

  


  

  

在V8的5.9版本出来之前,V8引擎使用了两个编译器:

  
      <李> full-codegen& # 8202; & # 8202;一个简单和非常快的编译器,产生简单和相对较慢的机器码。   <李>曲轴# 8202;——一种更复杂(即时)的优化编译器,生成高度优化的代码。   
  

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

  
      <李>主线程执行你所期望的操作:获取代码,编译代码并执行它李   <李>还有一个单独的线程用于编译,因此主线程可以在前者优化代码的同时继续执行   <李>一个分析器线程,它会告诉运行时我们花了很多时间,让曲轴可以优化它们李   <李>一些线程处理垃圾收集器李   
  

当第一次执行JavaScript代码时,V8利用full-codegen编译器,直接将解析的JavaScript翻译成机器代码而不进行任何转换。这使得它可以非常快速地开始执行机器代码。请注意,V8不使用中间字节码,从而不需要解释器。

  

当代码已经运行一段时间后,分析线程已经收集了足够的数据来判断应该优化哪个方法。

  

接下来,曲轴# 8202;从另一个线程开始优化。它将JavaScript抽象语法树转换为被称为氢的高级静态单分配(SSA)表示,并尝试优化氢图,大多数优化都是在这个级别完成的。

  

  

第一个优化是提前内联尽可能多的代码。内联是用被调用函数的主体替换调用点(调用函数的代码行)的过程。这个简单的步骤允许下面的优化更有意义。

  

 JavaScript深入V8引擎以及编写优化代码的5个技巧

  


  

  

JavaScript是一种基于原型的语言:没有使用克隆过程创建类和对象.JavaScript也是一种动态编程语言,这意味着可以在实例化后轻松地在对象中添加或删除属性。

  

大多数JavaScript解释器使用类似字典的结构(基于哈希函数)来存储对象属性值在内存中的位置,这种结构使得在JavaScript中检索属性的值比在Java或c#等非动态编程语言中的计算成本更高。

  

在Java中,所有对象属性都是在编译之前由固定对象布局确定的,并且无法在运行时动态添加或删除(当然,c#具有动态类型,这是另一个主题)。

  

因此,属性值(或指向这些属性的指针)可以作为连续缓冲区存储在存储器中,每个缓冲区之间具有固定偏移量,可以根据属性类型轻松确定偏移的长度,而在运行时可以更改属性类型的JavaScript中这是不可能的。

  

由于使用字典查找内存中对象属性的位置效率非常低,因此V8使用了不同的方法:隐藏类。隐藏类与Java等语言中使用的固定对象(类)的工作方式类似,只是它们是在运行时创建的。现在,让我们看看他们实际的例子:

JavaScript深入V8引擎以及编写优化代码的5个技巧