js性能填坑之路

简单介绍

  • javascript 是解释性语言,性能很慢,随着 web 在生活中的普及,这点性能显然不够用。你能想象双十一的一个按钮点半天才有反应嘛?所幸很多大神,都在不断的改进这个性能问题

漫漫填坑路

JIT

google 在 09 年 v8 引擎里引入 just in time compiling(即时编译),跟之前 ajax 出现引起的轰动是一样的,性能瞬间就上升了 20-40 倍的速度。

  • 从此网页进入了网页应用的时代

解释器和编译器

  • 解释器是一行行解释代码,性能会下降。编译器是把源代码编译成目标代码。
  • 解释器是叫他干什么立刻就去干什么,比如买菜,马上去市场回来,再去买油又马上市场
  • 编译器是叫他干什么直到说完才去干什么,去买菜,买油统一去市场
  • 但是 jit 是基于运行期编译,js 是一个没有类型的语言,所以 jit 大多数时候都在猜测 js 的类型。
1
2
3
4
5
6
function add(a, b) {
return a + b;
}
add(1, 2); //这时候jit就把a和b确认为int类型
//然后你这样做
add("hi", "yoki"); //已经编译成机器码了,但是又变成字符串类型,只能推倒重来,有时候jit的性能提升,还没有这个重编的开销大

TypeScript

  • 既然 jit 大多数时候在猜测类型,那索性搞个强类型语言,再编译成 js 就行了

asm.js

  • ts 是 js 的超集,这个是语法兼容 js 的汇编语言,是 js 的子集
  • 通过标注声明类型,而且不得改变,这样就节省了类型判断的时间

WebAssembly

  • 一种二进制码的规范,是比 asm.js 更为激进的东西
  • 理论上所有语言都可以编译成这个,然后泡在浏览器上
  • 但是目前还摸不了 dom