`
yunzhongxia
  • 浏览: 647288 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

V8引擎对JS数组的一些实现优化

 
阅读更多

先来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对数组的优化步骤如下:

  1. 预分配数组长度小于等于100000,或数组无洞,底层采用C数组实现;空间换时间

  2. 预分配数组长度大于100000,数组有洞,底层采用哈希表实现;时间换空间

  3. 处于字典模式(哈希表实现)的数组,在每次空间增长时,V8的启发式算法会检查其空间占用量, 若其空洞元素减少到一定程度,则会将其转化为高速模式(C数组)。

分享到:
评论

相关推荐

    Chrome V8引擎中的JavaScript数组实现分析与性能优化.pdf

    在本文中,我们将对Chrome V8引擎中的JavaScript数组实现进行深入分析,并探讨如何通过优化JavaScript数组的使用方式来提高程序效率。在实际应用中,JavaScript程序的复杂度越来越高,程序执行的性能问题变得越来越...

    Google V8引擎LIB库-谷歌Chrome JavaScript引擎

    6. `include` 文件夹: 包含了V8引擎的头文件,供开发者在C++项目中调用V8 API,实现JavaScript与C++的交互。 **使用V8引擎** 要在C++项目中使用Google V8,开发者需要包含对应的库文件,并使用提供的API来创建V8...

    adnroid-v8 js引擎

    2. **C++与JavaScript交互**: 开发者可以通过V8引擎在C++代码中执行JavaScript,实现两者之间的数据交换和功能调用。 三、利用V8引擎的头文件和库文件 你提到的`libv8.a`是一个静态库文件,包含了V8引擎的预编译...

    V8引擎测试代码-2014-11月v8版本代码编译

    1. **语法解析测试**:检查V8引擎对JavaScript语法的支持,包括ES5和当时的ES6新特性。 2. **类型系统测试**:测试V8的隐式和显式类型转换,以及如何在运行时跟踪和优化变量的类型。 3. **对象模型测试**:涵盖对象...

    《V8、JavaScript+的现在与未来》-迷渡

    文章深入探讨了JavaScript语言的发展历史、V8引擎的性能优化策略以及ECMAScript规范中TC39委员会的最新提案。此外,迷渡还探讨了如何编写高性能的JavaScript代码,这些内容对于前端开发人员和JavaScript引擎开发者来...

    Node.js背后的V8引擎优化技术.pdf

    Node.js 背后的 V8 引擎优化技术 Node.js 的执行速度远超 Ruby、Python 等脚本语言,这背后都是 V8 引擎的功劳。本文将介绍如何编写高性能 Node.js 代码。V8 是 Chrome 背后的 JavaScript 引擎,因此本文的相关优化...

    Node.js API详解之 V8模块用法实例分析

    Node.js API中的V8模块是Node.js与Google的V8 JavaScript引擎之间的接口,提供了对V8引擎内部特性的直接访问。V8模块包含了多种功能,如检查内存使用情况、配置引擎行为以及序列化和反序列化JavaScript值。以下是对...

    Chrome V8 Javascript Engine 2011-12-01: Version 3.7.12

    此外,V8引擎对Web API的集成也是其重要特性之一,如DOM操作、XMLHttpRequest、Web Workers等,使得JavaScript可以直接与浏览器交互,构建复杂的Web应用。在3.7.12版本中,这些API可能已经经过了充分的优化,提供了...

    v8-3.22.7.zip

    V8 JavaScript 引擎是Google开发的一个开源高...通过深入研究"v8-3.22.7.zip",开发者可以了解V8引擎在特定历史阶段的设计思想和技术实现,这对于理解JavaScript引擎的工作原理和优化JavaScript代码都有很大的帮助。

    V8 windows版本开发库(Debug)

    V8引擎的核心在于它的Just-In-Time (JIT) 编译技术,它将JavaScript源代码直接编译成机器码,以实现高效的执行速度。V8采用了分层的编译策略,包括快速的即时编译(Ignition)和优化的编译器(TurboFan)。Ignition...

    google v8 engine source

    V8对WebAssembly的优化使得它能与JavaScript并行运行,实现更高效的计算密集型任务。 8. **性能监控和分析工具** V8提供了诸如--trace-opt、--trace-deopt等命令行选项,帮助开发者理解代码优化过程。还有V8的CPU...

    node party 0729-面向前端开发者的V8性能优化.pdf

    V8引擎是Google开发的开源高性能JavaScript和WebAssembly引擎,广泛应用于Chromium和Node.js中。对于前端开发者来说,理解V8引擎的内部工作机制及其性能优化对提升代码执行效率至关重要。在文档“node party 0729-...

    JavaScript 数组的进化与性能分析

    总的来说,JavaScript数组从早期的哈希映射实现发展到现在,通过优化和引入类型化数组,极大地提高了性能和效率,尤其是在处理大量数据和高性能场景下。尽管JavaScript数组在实现上与传统语言有所不同,但通过利用...

    20200610-几个torque语句分析-杨文章.pdf

    本文通过分析`Load`、`Store`等Torque语句,揭示了V8引擎如何利用Torque语言对JavaScript数组操作进行优化。通过对数组元素类型进行精确控制和处理,V8能够生成更高效的C++代码,从而提升JavaScript的运行速度。这些...

    v8-test.zip

    总之,这个“v8-test.zip”压缩包提供了一个实践V8引擎的平台,结合VS2019和CLANG的使用,可以帮助开发者深入了解JavaScript的底层实现和C++编程技巧,对于学习V8引擎的工作原理及其在实际项目中的应用非常有价值。

    深入了解javascript 数组的sort方法

    为了避免最坏情况的发生,V8引擎和其他一些实现中使用了一些策略来避免这种情况,比如随机选择基准元素。 值得注意的是,sort方法在JavaScript中对数组进行排序时,它默认会将数组元素转换为字符串,并按照字典顺序...

    JavaScript_Shadow是一个全新的web引擎,几乎完全是用JS从头开始制作的.zip

    2. V8引擎优化:JavaScript Shadow可能借鉴了V8引擎的一些优化技术,如即时编译(JIT)、垃圾回收机制和高性能的数组处理。这些技术有助于提升JavaScript执行效率,使其能够应对高性能计算任务。 3. WebAssembly...

    v8-1.3.18.20

    V8引擎以其高效的即时编译(JIT)技术、优化的垃圾回收机制以及对ECMAScript规范的紧密遵循而闻名。 在1.x系列中,V8主要支持ECMAScript 5标准,包括但不限于: 1. **严格模式**:ECMAScript 5引入了严格模式(use...

    js中数组排序sort方法的原理分析.docx

    某些引擎(如V8)使用优化的快速排序算法,而其他引擎可能采用更简单但效率较低的冒泡排序。开发者不应依赖`sort()`的具体实现,而应关注其行为的一致性和提供的比较函数。 此外,你提到的“找到最小值插入”的排序...

Global site tag (gtag.js) - Google Analytics