Chrome V8引擎的一点认识
最近在玩弄JavaScript ,也一直在捉摸,脚本Engine怎么解析你写的Code,对Google兴趣浓,索性就看了谷歌的脚本engine的官方资料,都是E文的,但是却是最纯的不是,看下来总结V8性能的几点表现:
1.快速属性访问
相比于其他语言,JavaScript是动态编程语言,属性可添可减,对象自由调用,意味着对象的属性很容易改变,相比于其他的脚本引擎,IE的JScript,FF的SpiderMonkey 和Safari的JavaScriptCore,大部分使用像字典结构的的存储结构-每个属性访问必须查找和解释属性在内存中的位置。这样就导致要比像Java那样的实例访问要慢,为了减少访问属性的时间,V8动态的创建隐藏类(Hidden Classes)在后台,每次对象属性的增减,都会在原来的Hidden Classes基础上生成一个新的Hidden Classes.
1 function Point(x, y){
2 this.x = x;
3 this.y = y;}
4 }
定义一个这样的函数,共有3个Hidden class的生成,初始化C0,无任何属性,然后添加一个属性x,Hidden Class从C0变成C1,添加了一个属性x,同理C1到C2。这样属性访问不需要字典查找,使用这样一个经典的基于类的优化-内联缓存。更多内联缓存信息请看:
2.动态机器码生成
V8针对Code,执行的时候是直接生成机器码,而不是Byte Code ,例如,访问上面Point的属性x
point.x
在V8中,为了访问x,机器码如下。
1 # ebx = the point object
2 cmp [ebx,<hidden class offset>],<cached hidden class>
3 jne <inline cache miss>
4 mov eax,[ebx, <cached x offset>]
如果point的隐藏类不匹配缓存的隐藏类,则跳过cmp,执行jne(针对丢失的内联缓存,修补这个内联缓存),然后再执行cmp,这样的一个过程实现了属性x的访问。当有多个相同对象时,将会共享这个缓存的Hidden class.这样极大加速了Code的执行。
3.高效分代垃圾回收机制
众所周知的垃圾回收,V8回收内存不再是通过进程而是对象机制,对象会被分配到两块空间,一块是对象创建的空间,一块是在垃圾回收的空间,如果对象被移入到垃圾回收空间,V8会更新所有指向对象的指针,这样避免了内存泄漏的风险。
Chrome V8引擎的一点认识的更多相关文章
- 浅谈Chrome V8引擎中的垃圾回收机制
垃圾回收器 JavaScript的垃圾回收器 JavaScript使用垃圾回收机制来自动管理内存.垃圾回收是一把双刃剑,其好处是可以大幅简化程序的内存管理代码,降低程序员的负担,减少因 长时间运转而带 ...
- Chrome V8系列--浅析Chrome V8引擎中的垃圾回收机制和内存泄露优化策略
V8 实现了准确式 GC,GC 算法采用了分代式垃圾回收机制.因此,V8 将内存(堆)分为新生代和老生代两部分. 一.前言 V8的垃圾回收机制:JavaScript使用垃圾回收机制来自动管理内存.垃圾 ...
- Node.js和Chrome V8 引擎了解
说起Node就不得不先介绍一个Chrome V8 引擎. 随着Web相关技术的发展,JavaScript所要承担的工作也越来越多,早就超越了“表单验证”的范畴,这就更需要快速的解析和执行JavaScr ...
- Chrome V8 引擎源码剖析
Chrome V8 引擎源码剖析 V8 https://github.com/v8/v8 array & sort https://github.com/v8/v8/search?l=Java ...
- Chrome V8引擎系列随笔 (1):Math.Random()函数概览
先让大家来看一幅图,这幅图是V8引擎4.7版本和4.9版本Math.Random()函数的值的分布图,我可以这么理解 .从下图中,也许你会认为这是个二维码?其实这幅图告诉我们一个道理,第二张图的点的分 ...
- JavaScript工作机制:V8 引擎内部机制及如何编写优化代码的5个诀窍
概述 JavaScript引擎是一个执行JavaScript代码的程序或解释器.JavaScript引擎可以被实现为标准解释器,或者实现为以某种形式将JavaScript编译为字节码的即时编译器. 下 ...
- JavaScript深入浅出第4课:V8引擎是如何工作的?
摘要: 性能彪悍的V8引擎. <JavaScript深入浅出>系列: JavaScript深入浅出第1课:箭头函数中的this究竟是什么鬼? JavaScript深入浅出第2课:函数是一等 ...
- V8引擎嵌入指南
如果已读过V8编程入门那你已经熟悉了如句柄(handle).作用域(scope)和上下文(context)之类的关键概念,以及如何将V8引擎作为一个独立的虚拟机来使用.本文将进一步讨论这些概念,并介绍 ...
- 精读《V8 引擎 Lazy Parsing》
1. 引言 本周精读的文章是 V8 引擎 Lazy Parsing,看看 V8 引擎为了优化性能,做了怎样的尝试吧! 这篇文章介绍的优化技术叫 preparser,是通过跳过不必要函数编译的方式优化性 ...
随机推荐
- Base64编码——学习笔记
Base64是一种编码方式. 非加密 chcp->936 编码流程: 位数不够后面补0,例中补了2个0. 末尾加=表示结束符. GB2312,有些敏感词不能显示. GBK,是GB2312升级版. ...
- symfony 命令
1.创建Bundle php bin/console generate:bundle --namespace=Home/IndexBundle --format=yml 创建bundle会更新app ...
- js合并.css合并工具
http://www.neoease.com/css-javascript-combo-tool/ http://www.neoease.com/minimize-javascript-files-u ...
- C++实现按1的个数排序
题目内容:有一些0.1字符串,将其按1的个数的多少的顺序进行输出. 输入描述:本题只有一组测试数据.输入数据由若干数字组成,它是由若干个0和1组成的数字. 输出描述:对所有输入的数据,按1的个数进行生 ...
- java痛苦学习之路[十]--日常问题汇总
FIddler2 1.FIddler2 request请求的參数出现中文乱码问题时,须要进行一下设置: 打开注冊表编辑器,找到HKCU\Software\Microsoft\Fiddler 2\,在 ...
- 03-Linux各目录及每个目录的详细介绍
Linux各目录及每个目录的详细介绍 [常见目录说明] 目录 /bin 存放二进制可执行文件(ls,cat,mkdir等),常用命令一般都在这里. /etc 存放系统管理和配置文件 /home 存放所 ...
- 8 -- 深入使用Spring -- 4...6 AOP代理:基于注解的XML配置文件的管理方式
8.4.6 基于XML配置文件的管理方式 Spring 2.x 提供一个新的aop:命名空间来定义切面.切入点和增强处理. XML配置方式优点: ⊙ 如果应用没有使用JDK 1.5 以上版本,那么应用 ...
- 【RF库Collections测试】List Should Contain Value
Name:List Should Contain ValueSource:Collections <test library>Arguments:[ list_ | value | msg ...
- 《Lua程序设计》第7章 迭代器与泛型for 学习笔记
本章将介绍如何编写适用于泛型for的迭代其(Iterator).7.1 迭代器与closurehttp://www.cnblogs.com/moonlightpoet/p/5685275.html 7 ...
- MD5加密与base64编码
转自:http://blog.csdn.net/sxzlc/article/details/74127268 import java.io.UnsupportedEncodingException; ...