20201205_V8中的指针压缩及其源码分析-.pdf
### V8中的指针压缩及其源码分析 #### 1. V8采用Pointer-compressed的背景 V8作为一款高性能的JavaScript和WebAssembly引擎,在Chrome和Node.js等平台发挥着核心作用。随着2014年Chrome浏览器从32位升级至64位,虽然提升了安全性、稳定性和性能,但也带来了一个显著的问题——内存消耗增加。具体表现为指针大小由原来的4字节变成了8字节,这对于大量依赖指针的V8引擎来说,无疑增加了巨大的内存负担。 #### 2. Value Tagging 为了解决这一问题,V8引入了Value Tagging技术。该技术主要通过将一些标记(tag)存储在指针的低位(通常是低2位),以此来区分不同的数据类型,例如指针(Pointer)和小整数(Smi)。在32位和64位架构中,由于指针的低两位总是0,因此可以充分利用这一点进行标记。 - **32位架构下的Value Tagging**:如图所示,低2位被用来存储tag,以标识数据类型。 - **64位架构下的Value Tagging**:同样地,低2位用于存储tag,但因为地址空间更宽,所以有更多的空间来实现更复杂的标记策略。 #### 3. Pointer-compressed引起的内存布局变化 为了适应指针压缩技术,V8必须调整其内存布局。指针压缩的基本原理是采用一个32位偏移量(offset)和一个32位基地址(base)来替代原有的64位指针。这样,可以显著减少指针所占的空间。为了使这一方案可行,V8需要满足以下条件: - 所有的V8对象都必须分配在4GB的地址范围内。 - 需要一个全局变量来保存基地址(base)。 ##### Pointer-compress下的内存布局 根据不同的内存布局,基地址(base)可以对齐到4GB内存的起始位置或中间位置。不同的布局方式对性能和内存使用有不同的影响。 - **基地址对齐到4GB内存起始位置**:这种情况下,可以将int64_t类型的指针转换为uint64_t类型,从而避免符号扩展操作,进一步提升性能。 - **基地址对齐到4GB内存中间位置**:在这种布局下,虽然没有前一种方案的优势,但依然能够有效减小指针的大小。 #### 4. 针对Pointer-compressed的优化 为了最大限度地减少因指针压缩带来的性能损失,V8团队进行了多方面的优化: - **优化一:有分支版本提高7%**。通过对解压操作的代码进行优化,使用有分支的解压版本相较于无分支版本能提高约7%的性能。 - **优化二:消除连续的压缩和解压缩操作提高2%**。通过消除那些连续的压缩和解压缩操作,可以进一步提高性能。 - **优化三:去除多余的指令提高2%**。例如,通过简化像`mov lr ax, <mem>`这样的加载操作,减少不必要的指令,提升效率。 - **优化四:更新模式匹配与解压优化提高11%**。通过改进模式匹配算法以及优化解压过程,可以显著提高性能。 - **优化五:处理Smi数据类型提高2.5%**。针对Smi数据类型的特殊处理也能够带来一定的性能提升。 #### 5. 启用Pointer-compressed的效果 启用指针压缩技术后,V8引擎能够在保持高性能的同时,大幅度减少内存消耗。根据实际测试,指针压缩技术使得内存使用量显著下降,同时对于某些特定场景下的性能也有显著提升。 - **内存消耗**:通过指针压缩技术的应用,V8引擎成功降低了内存消耗,特别是在64位环境下,这种效果尤为明显。 - **性能表现**:虽然指针压缩在理论上可能会带来一些性能损失,但通过上述一系列优化措施,实际上不仅弥补了这些损失,还在某些方面实现了性能的提升。 V8引擎通过采用指针压缩技术,成功应对了64位环境下内存消耗增加的问题,并且通过不断的优化,确保了性能上的稳定性甚至有所提升。这对于保障Web应用的高效运行具有重要意义。
剩余13页未读,继续阅读
- 粉丝: 38
- 资源: 730
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助