最好的指针标记方法是什么?

主要观点:深入探讨指针标记(pointer tagging),将元数据编码到字大小的指针中,可在机器寄存器中传递紧凑表示,常用于实现动态编程语言等,测试 4 种不同类型的标记指针并与胖指针对比,分不同基准测试其性能,包括检查标签和获取数据等操作,不同架构和指令集下各标记方案性能有差异,在函数调用等场景中也有表现,还探讨了消除指针标记等情况以及浮点相关问题,最终认为系统性能瓶颈是内存而非 CPU 指令,这些基准测试优化的并非关键,同时介绍了标记指针的其他方面及相关研究。

关键信息:

  • 4 种标记指针类型:低位标记、低位字节标记、高位字节标记、高位位标记,还有纳米装箱(Nan Boxing)。
  • 测试基准:检查标签(仅检查指针是否匹配特定标签并递增计数器)、获取数据(解标记指针并将其值添加到滚动总和中)。
  • 不同标签值的测试结果:零值时对齐位标记性能好,非零值时对齐标记与其他方式相似,高位位标记在某些情况下优于低位标记,Tagged 版本在某些计数基准中比基线快。
  • 函数调用场景:非标记指针尺寸大易导致参数溢出到栈,性能不如标记指针,大块操作时标记指针更优。
  • 消除指针标记:基线能完全消除标记,其他方案有额外指令,通过提示可改善部分情况。
  • 浮点相关:纳米装箱在大型数据结构中可能更优,但微基准测试难以体现其优势。

重要细节:

  • 不同架构下的性能差异,如 x86 和 ARM 上各标记方案的表现不同。
  • 编译器在优化方面的差异,如 clang/LLVM 和 GCC 对特定优化的处理不同。
  • 标记指针的其他特性,如总标签数、可移植性等,还有更多标记指针的技巧未提及。
  • 基准测试代码可在这里找到,讨论可在HN等平台进行。
阅读 14
0 条评论