JavaScript 性能提升技巧

56 阅读3分钟

13 个 JavaScript 性能提升技巧

Daniel Clifford 在Google I/O2012 上做了一个精彩的演讲“Breaking the JavaScript Speed Limit with V8”。在演讲中,他深入解释了 13 个简单的代码优化方法,可以让你的JavaScript代码在 Chrome V8 引擎编译/运行时更加快速。在演讲中,他介绍了怎么优化,并解释了原因。下面简明的列出了13 个 JavaScript 性能提升技巧

  1. 在构造函数里初始化所有对象的成员(所以这些实例之后不会改变其隐藏类);

  2. 总是以相同的次序初始化对象成员;

  3. 尽量使用可以用 31 位有符号整数表示的数;

  4. 为数组使用从 0 开始的连续的主键;

  5. 别预分配大数组(比如大于 64K 个元素)到其最大尺寸,令其尺寸顺其自然发展就好;

  6. 别删除数组里的元素,尤其是数字数组;

  7. 别加载未初始化或已删除的元素;

  8. 对于固定大小的数组,使用”array literals“初始化(初始化小额定长数组时,用字面量进行初始化);

  9. 小数组(小于 64k)在使用之前先预分配正确的尺寸;

  10. 请勿在数字数组中存放非数字的值(对象);

  11. 尽量使用单一类型(monomorphic)而不是多类型(polymorphic)(如果通过非字面量进行初始化小数组时,切勿触发类型的重新转换);

  12. 不要使用 try{} catch{}(如果存在 try/catch 代码快,则将性能敏感的代码放到一个嵌套的函数中);

  13. 在优化后避免在方法中修改隐藏类

    1. 对象属性的顺序: 在实例化你的对象属性的时候一定要使用相同的顺序,这样隐藏类和随后的优化代码才能共享;
  14. 动态属性: 在对象实例化之后再添加属性会强制使得隐藏类变化,并且会减慢为旧隐藏类所优化的代码的执行。所以,要在对象的构造函数中完成所有属性的分配;

  15. 方法: 重复执行相同的方法会运行的比不同的方法只执行一次要快 (因为内联缓存);

  16. 数组: 避免使用 keys 不是递增的数字的稀疏数组,这种 key 值不是递增数字的稀疏数组其实是一个 hash 表。在这种数组中每一个元素的获取都是昂贵的代价。同时,要避免提前申请大数组。最好的做法是随着你的需要慢慢的增大数组。最后,不要删除数组中的元素,因为这会使得 keys 变得稀疏;

  17. 标记值 (Tagged values) : V8 用 32 位来表示对象和数字。它使用一位来区分它是对象 (flag = 1) 还是一个整型 (flag = 0),也被叫做小整型(SMI),因为它只有 31 位。然后,如果一个数值大于 31 位,V8 将会对其进行 box 操作,然后将其转换成 double 型,并且创建一个新的对象来装这个数。所以,为了避免代价很高的 box 操作,尽量使用 31 位的有符号数。

www.zhihu.com/tardis/zm/a…