1 JS语言与性能问题
JS比Java慢的原因
和大多数解释型语言一样,JavaScript运行也比较慢,和Java等静态编译语言相比,究其原因大概有
- JS变量无类型信息,不能做偏移信息查找,偏移信息共享等编译阶段的优化
- JS将源码编译为字节码的过程要占用运行时间,而Java的编译则是开发阶段,不占用任何运行时间。故Java可以尽可能的在编译阶段做优化
JS引擎组成
一个JS引擎大概包含以下几个部分。
- 编译器:将源码转变为抽象语法树,某些引擎还将语法树转变为了字节码。编译过程会占用用户时间。
- 解释器:接收字节码,执行它。需要处理内存分配,动态优化等
- JIT:运行时优化,热点代码字节码转变为本地代码。和Java中的JIT类似。如果优化没有达到效果,还会回退为优化前代码。
- 垃圾回收器GC和分析工具,分析工具收集运行时信息,如热点代码探测。
2 V8引擎
数据表示
数据的表示有两部分。数据实际内容,变长的,如String,Object等。 数据句柄,大小固定,包含指向数据的指针。这样设计的原因是,垃圾回收碎片处理时,一般需要移动数据来形成连续的一块可用内存。使用句柄可以通过修改句柄中指针即可,而数据本身不用改变。我们引用这个数据时,通过句柄即可。对于整形数据,直接放在放在句柄中。而对于其他数据,句柄保存的都只是他们的指针而已,真实内存需要从堆中去