看完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会创造一种新的隐藏类型,这是昂贵的。
优化策略:
-
Initialize all object members in constructor functions 在构造函数中初始化所有属性
-
Alwayse initialize members in same order 始终按照同样顺序初始化属性
数字 Numbers
V8 用32位的空间存储变量指针,为了提高int处理效率,直接用一个标志位来表示它是int还是指针,因此,还剩下31位的空间用于存储指针或int值。当标志位为1,是对象指针,当标志位为0,是31位有符号整数,区间是 [-1073741825, 1073741824],(如本人理解有误,请各位指正)
优化策略:
- 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
优化策略:
-
Use contiguous keys starting at 0 for Arrays 从0开始连续的初始化数组,否则将会转换位字典模式。
-
Don’t pre-allocate large Arrays (e.g. > 64K elements) to their maximum size, instead grow as you go 不要预分配一个超大数组(比如64K元素),如果你只用了开始的一部分,这将转换为字典模式。
-
Don’t delete elements in arrays, especially numeric arrays 不要删除数组中的元素,尤其是数字数组。同样会转换为字典模式。
-
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];
优化策略:
-
Initialize using array literals for small fixed-sized arrays 尽可能对小的定长数组使用“字面数组”(array literal)初始化。
-
Preallocate small arrays to correct size before using them 使用前为数组预分配正确的尺寸,前提是小于64k的数组。 这里有一句没听懂“but only if … ” 求听清楚的告知。
-
Don’t store non-numeric values (objects) in numeric arrays 不要在数字数组中存入非数字值。
——待续