《突破V8性能极限》观后总结
发布于 12 年前 作者 guilin 14432 次浏览 最后一次编辑是 8 年前

看完v8 tech leader在google IO上的演讲,做了点总结,与大家分享

视频 http://www.tudou.com/programs/view/bqxvrifP4mk/ Slide http://v8-io12.appspot.com/

Breaking the JavaScript Speed Limit with V8 Daniel Clifford Manager and Tech Lead V8 Team, Google Chrome

Hidden class 隐藏类型

每次添加新属性,v8会创造一种新的隐藏类型,这是昂贵的。

优化策略:

  1. Initialize all object members in constructor functions 在构造函数中初始化所有属性

  2. Alwayse initialize members in same order 始终按照同样顺序初始化属性

数字 Numbers

V8 用32位的空间存储变量指针,为了提高int处理效率,直接用一个标志位来表示它是int还是指针,因此,还剩下31位的空间用于存储指针或int值。当标志位为1,是对象指针,当标志位为0,是31位有符号整数,区间是 [-1073741825, 1073741824],(如本人理解有误,请各位指正)

优化策略:

  1. Prefer numeric values that can be represented as 31-bit signed integers 数字的值尽可能使用31位有符号整数。

Arrays 数组

V8数组有两种模式,一种是紧凑的快速模式,另一种是松散的字典模式。 Fast Elements: linear storage for compact key sets Dictionary Elements: hash table storage otherwise

优化策略:

  1. Use contiguous keys starting at 0 for Arrays 从0开始连续的初始化数组,否则将会转换位字典模式。

  2. Don’t pre-allocate large Arrays (e.g. > 64K elements) to their maximum size, instead grow as you go 不要预分配一个超大数组(比如64K元素),如果你只用了开始的一部分,这将转换为字典模式。

  3. Don’t delete elements in arrays, especially numeric arrays 不要删除数组中的元素,尤其是数字数组。同样会转换为字典模式。

  4. Don’t load uninitialized or deleted elements 不要访问未初始化或已删除的数组元素

Double Array Unboxing

Double数组Unboxing

Double数组是一种特殊的数组,double数组是展开的,每个元素都是直接存储double值,而非指向double值的指针。下面3句不知道如何翻译,大家自己理解吧。

Array’s hidden class tracks element types Arrays containing only doubles are unboxed Unboxing causes hidden class change

Careless manipulation of Arrays can cause extra work due to boxing and unboxing 不小心的数组操作会引起不必要的封装和展开

如下面的代码将因double数组产生2次额外的重新分配

var a = new Array();
a[0] = 77;   // 分配数组
a[1] = 88;
a[2] = 0.5;   // 重新分配,转换为展开的double数组 
a[3] = true; // 重新分配, 转换为封装的指针数组

对此的解决办法是这样:

var a = [77, 88, 0.5, true];

优化策略:

  1. Initialize using array literals for small fixed-sized arrays 尽可能对小的定长数组使用“字面数组”(array literal)初始化。

  2. Preallocate small arrays to correct size before using them 使用前为数组预分配正确的尺寸,前提是小于64k的数组。 这里有一句没听懂“but only if … ” 求听清楚的告知。

  3. Don’t store non-numeric values (objects) in numeric arrays 不要在数字数组中存入非数字值。

——待续

17 回复

这是跟具体JS引擎实现细节相关的,什么时候V8优化方式一变,编程实践就不同了……

这篇之所以有价值,因为他是v8 tech leader 所做的分享,可见它是有一定时效性的, 至少是一个不错的编码习惯.

以前发的 delete的问题就是破坏了 隐藏类型

pop 应该不算,线性转字典,主要是因为数组碎片化了.

可以实测一下试试

昨天没看完,今天继续看,一边听译吧。

可以针对每个优化点,做benchmark测试验证一下。

不错,为了系统性能,我们需要了解如何编码才能跑的更好。

既然 javascript 的语法超级简单,没有其他语言那么复杂的数据类型和数据结构,那么它一定是在内部隐含了更细更复杂的设计,理解了这个,就能写出性能更好的代码。

好东西要围观

哪都看到你的身影,如此伟岸,,

V8代码看得懂么:(

@lanceng 都在哪里看到楼上了?

@kingapple 在你心里,恨恨,,,

@lanceng 霍霍,楼上肿么了?

12年的被挖坟挖出来了~

回到顶部