v8引擎的优化
1、编译优化
V8采用JIT即使编译技术.
例如JAVA是先编译成字节码,再由JVM编译成机器码,V8则没有中间的字节码,直接由源码生成语法树,然后编译成机器码.
2、隐藏类
当定义一个构造函数,使用这个函数生成的第一个对象的时候,v8会为它初始化一个隐藏类,以后使用这个构造函数生成的对象指向同一个隐藏类.当对这个构造函数新增或者删除属性或者方法时,会派生出新对隐藏类.隐藏类起到了给对象分组对作用,同一组对象,具有相同的成员名称,隐藏类记录了成员的名称和偏移量,根据这些信息,V8能够按照对象首地址+偏移量访问成员变量,程序中,相对于把属性名作为键值,使用字典的查找方式存取成员,使用索引方式性能的改进更明显.
3、内联缓存
成员的索引是以哈希表的方式存在隐藏类中,如果每次存取属性都搜寻隐藏类的哈希表,这种使用偏移量的方式不会带来任何好处.
内敛缓存是基于程序运行的局部性原理,动态生成使用索引查找的代码,下次存取成员就不必再去搜寻哈希表了.
4、优化回退
当V8发现某函数执行频繁,就将其标记为热点函数,认为此函数比较稳定,类型已经确定,于是调用Crankshaft编译器,生成更高效的机器码,后面万一遇到类型变化,V8采取将JS函数回退到优化前的较一般情况.
回退过程就是根据函数源码,生成响应语法树,然后编译成一般形式的机器码,可以预见这个过程比较耗时,要避免这种情况.
//bad case
function add(a,b){
return a + b
} for(let i = 0; i < 5; i++) {
add(i, i+1)
} add('a', 'b') // good case
function add(a,b){
return a + b
}
function addStr(a,b){
return a + b
}
for(let i = 0; i < 5; i++) {
add(i, i+1)
}
addStr('a', 'b')
函数内部参数类型越确定.V8越能够生成优化后代码.
v8引擎的优化的更多相关文章
- JavaScript是如何工作的02:深入V8引擎&编写优化代码的5个技巧
概述 JavaScript引擎是执行 JavaScript 代码的程序或解释器.JavaScript引擎可以实现为标准解释器,或者以某种形式将JavaScript编译为字节码的即时编译器. 以为实现J ...
- 精读《V8 引擎 Lazy Parsing》
1. 引言 本周精读的文章是 V8 引擎 Lazy Parsing,看看 V8 引擎为了优化性能,做了怎样的尝试吧! 这篇文章介绍的优化技术叫 preparser,是通过跳过不必要函数编译的方式优化性 ...
- How Javascript works (Javascript工作原理) (二) 引擎,运行时,如何在 V8 引擎中书写最优代码的 5 条小技巧
个人总结: 一个Javascript引擎由一个标准解释程序,或者即时编译器来实现. 解释器(Interpreter): 解释一行,执行一行. 编译器(Compiler): 全部编译成机器码,统一执行. ...
- JavaScript工作机制:V8 引擎内部机制及如何编写优化代码的5个诀窍
概述 JavaScript引擎是一个执行JavaScript代码的程序或解释器.JavaScript引擎可以被实现为标准解释器,或者实现为以某种形式将JavaScript编译为字节码的即时编译器. 下 ...
- 使用 D8 分析 javascript 如何被 V8 引擎优化的
在上一篇文章中我们讲了如何使用 GN 编译 V8 源码,文章最后编译完成的可执行文件并不是 V8,而是 D8.这篇我们讲一下如何使用 D8 调试 javascript 代码. 如果没有 d8,可以使用 ...
- Chrome V8系列--浅析Chrome V8引擎中的垃圾回收机制和内存泄露优化策略
V8 实现了准确式 GC,GC 算法采用了分代式垃圾回收机制.因此,V8 将内存(堆)分为新生代和老生代两部分. 一.前言 V8的垃圾回收机制:JavaScript使用垃圾回收机制来自动管理内存.垃圾 ...
- (译)V8引擎介绍
V8是什么? V8是谷歌在德国研发中心开发的一个JavaScript引擎.开源并且用C++实现.可以用于运行于客户端和服务端的Javascript程序. V8设计的初衷是为了提高浏览器上JavaScr ...
- V8引擎嵌入指南
如果已读过V8编程入门那你已经熟悉了如句柄(handle).作用域(scope)和上下文(context)之类的关键概念,以及如何将V8引擎作为一个独立的虚拟机来使用.本文将进一步讨论这些概念,并介绍 ...
- 浅谈V8引擎中的垃圾回收机制
最近在看<深入浅出nodejs>关于V8垃圾回收机制的章节,转自:http://blog.segmentfault.com/skyinlayer/1190000000440270 这篇文章 ...
随机推荐
- 为什么需要在 React 类组件中为事件处理程序绑定this?
https://juejin.im/post/5afa6e2f6fb9a07aa2137f51 事件绑定作为回调函数参数传递给函数,丢失其上下文,执行的是默认绑定,不是隐式绑定 类声明和类表达式的主体 ...
- Git--04 Github使用
目录 Github使用 1.注册用户 2.配置ssh-key 3.创建项目 4.克隆项目到本地 5.推送新代码到github Github使用 Github顾名思义是一个Git版本库的托管服务,是目前 ...
- Codeforces Round #393 (Div. 2) - A
题目链接:http://codeforces.com/contest/760/problem/A 题意:给定一个2017年的月份和该月的第一天的星期,问该月份的日历表中需要多少列.行有7列表示星期一~ ...
- 【Leetcode周赛】从contest-41开始。(一般是10个contest写一篇文章)
Contest 41 ()(题号) Contest 42 ()(题号) Contest 43 ()(题号) Contest 44 (2018年12月6日,周四上午)(题号653—656) 链接:htt ...
- MySQL中常见函数
一.日期函数 1.NOW() 返回当前日期和时间 mysql> SELECT NOW(); +---------------------+ | NOW() | +-------------- ...
- ubuntu 开启ftp服务
一. 检查是否已安装 vsftpd vsftpd -v 二. 安装 vsftpd apt-get install vsftpd 三. 检查是否已安装好 vsftpd vsftpd -v system ...
- Restful风格接口浅析
为什么使用RESTful1.JSP技术可以让我们在页面中嵌入Java代码,但是这样的技术实际上限制了我们的开发效率,因为需要我们Java工程师将html转换为jsp页面,并写一些脚本代码,或者前端代码 ...
- 目前在玩的几款手机挖矿APP
目前在玩的几款手机挖矿APP 1.网易星球 网易星球app是由网易最新推出的区块链产品,网易星球app用户获得邀请码注册之后就能免费领取数字资产“黑钻”,网易星球app还支持信息安全存储.去中心化价值 ...
- WORM Worm worm 毛毛虫爬树爬树~
对于动态规划,我也就不多说了.因为还不会, 每个题都不一样,但大致原则是一样的.抓住题意, 本题:n棵树,毛毛虫在m分钟内从p到t的路线种数,毛毛虫只可以向左右相邻位置走. 中心代码: for(i = ...
- python中将'12345'转换为12345,不要使用int
#将'12345'转换为12345,不要使用int s = " #定义一个数字变量 ret = 0 for x in s : ret = ret*10 +( ord(x)-ord(" ...