先来2个例子吧:
var t = new Array(200000); console.time('time1'); for (var i = 0; i < 200000; ++i) {t.push(1);} console.timeEnd('time1');
var t = []; console.time('time2'); for (var i = 0; i < 200000; ++i) {t.push(1);} console.timeEnd('time2');
各位可以在各个浏览器控制台下看看输出情况, 我这的情况大概如下:
chrome
time1: 59109.000ms
time2: 379.000ms
FireFox
time1: 509ms
time2: 461ms
IE
time1: 351ms
time2: 356ms
在StackOverflow上看到的结论如下:
如果数组索引从0到length-1,而又无洞(注:洞的意思即存在索引所指向的元素未赋值),那么这个引擎会用C语言的数组来实现,因此会非常快。
如果在数组中有洞,引擎将会用哈希表来实现,这会比C数组慢许多。
例外情况是:如果预分配的数组长度小于100000, 引擎依然会用C数组实现,此时该数组有洞又有速度0- -!
以下代码说明了这点:
var t = new Array(99999); console.time('time1'); for (var i = 0; i < 200000; ++i) {t.push(1);} console.timeEnd('time1');
var t = new Array(99999+1); console.time('time2'); for (var i = 0; i < 200000; ++i) {t.push(1);} console.timeEnd('time2');
chrome下运行结果如下:
time1: 447.00ms
time2: 4110.000msms
不止这些,再来2个更神奇的例子:
var t = new Array(180000); console.time('time1'); for (var i = 0; i < 200000; ++i) {t.push(1);} console.timeEnd('time1');
var t = new Array(181000); console.time('time2'); for (var i = 0; i < 200000; ++i) {t.push(1);} console.timeEnd('time2');
chrome输出如下:
time1: 4165.000ms
time1: 59034.000ms
对此解释如下:
V8引擎的启发式算法会将符合条件的处于字典(哈希表)模式的数组转化为快速(C数组)模式。 当数组处于字典模式,在它每次要增长时,V8会检查数组是否足够紧缩,且使用连续的C数组替代字典数组是否能在空间上更有优势。
在上面的2个例子中,第一个例子被替换为了C数组, 第二个例子在空间上不具备更大的优势,则未回退。
总结
V8对数组的优化步骤如下:
-
预分配数组长度小于等于100000,或数组无洞,底层采用C数组实现;空间换时间
-
预分配数组长度大于100000,数组有洞,底层采用哈希表实现;时间换空间
-
处于字典模式(哈希表实现)的数组,在每次空间增长时,V8的启发式算法会检查其空间占用量, 若其空洞元素减少到一定程度,则会将其转化为高速模式(C数组)。
相关推荐
Chrome V8引擎中的JavaScript数组实现分析与性能优化
c# 、asp.net 在后台使用谷歌V8引擎执行js,将示例工程中的GoogleV8Engine.cs文件复制到你的项目中。将GoogleV8Engine_x64.dll 和 GoogleV8Engine_x86.dll 两个非托管DLL文件拷贝到工程部署的DLL目录下(ASP.Net拷贝...
Google V8 引擎使用 C++ 代码编写,实现了 ECMAScript 规范的第五版,可以运行在所有的主流操作系统中,甚至可以运行在移动终端 ( 基于 ARM 的处理器,如 HTC G7 等 )。V8 最早被开发用以嵌入到 Google 的开源浏览器...
编写Python API,然后使用V8引擎从JavaScript中调用它们。使用V8引擎从JavaScript中调用Python API
nodejs google v8引擎的服务器端js实现,强悍的服务器端脚本,让JS无所不能
V8 javascript引擎源代码V8 javascript引擎源代码V8 javascript引擎源代码V8 javascript引擎源代码
chrome_v8_js引擎源码导读分析 第一章 v8 之整体流程 第二章 v8 之全局环境配置及初始化 2.1 全局模板 2.2 库函数 2.3 初始化 第三章 v8 之前端建立语法树 3.1 v8 编译中重要的类 3.2 compile之前的查找 ...
配套“编译v8引擎”文章使用 chrome浏览器js解析引擎 node.js
v8版本8.0.397 win10下vs2019编译的x64静态库 debug版本/MDd release版本/MD
V8 JavaScript引擎的PHP扩展
V8是一个由美国Google开发的开源JavaScript引擎,用于Google Chrome中。[2]Lars Bak是这个项目的组长。[3] V8在运行之前将JavaScript编译成了机器码,而非字节码或是解释执行 它,以此提升性能。更进一步,使用了如...
Chrome V8 JavaScript引擎 源代码
易语言使用v8引擎(基于UseDotNet)。v8.e 中的 V8Engine类 与 Handle类 是由 类库查看器生成的代码。v8.net 介绍 。http://blog.csdn.net/david136796/article/details/49660735。@为你芯冻。
配套“编译v8引擎”文章使用 chrome浏览器js解析引擎 node.js
Node.js背后的V8引擎优化技术.pdf
配套“编译v8引擎”文章使用 chrome浏览器js解析引擎 node.js
关于V8设计的讲解,有助于理解和使用V8引擎,学习V8的设计。
V8 Javascript Engine for PHP — This PHP extension embeds the Google V8 Javascript Engine 标签:v8js
V8引擎测试代码-2014-11月v8版本代码编译
delphi google V8 脚本引擎接口 delphi程序 最佳 javascript 途径 模拟HTTP 加解密的神器,有demo D7-东京编译通过