在《Ruby 语法圣杯:在 Ruby VM 中添加 opt_respond_to,第三部分》中,作者发现了 Ruby 语法编译过程的一个可读且连续的视角,他称之为“圣杯”。本文继续探索,尝试优化 respond_to? 方法调用的性能。
作者首先获得了一些建议,提示他需要关注窥孔优化器。窥孔优化器是一种编译器优化技术,它通过替换等效的指令集来提高性能。作者的目标是替换现有的 opt_send_without_block 指令,用一个专门针对 respond_to? 方法调用的 opt_respond_to 指令来优化。
作者通过研究 Étienne 的冻结数组优化代码,找到了 CRuby 中的窥孔优化器 iseq_peephole_optimize 函数。并利用 lldb 调试器,逐步跟踪了这个优化过程,发现窥孔优化是在 Prism 编译节点之后进行的“专业化”步骤。
作者了解到 Ruby 只有在加载时才会编译代码,并且每个代码片段的编译都是延迟的。通过调试,他还找到了 test.rb 文件编译的入口点,并设法只调试 test.rb 的编译过程。
接下来,作者尝试在 iseq_peephole_optimize 中添加代码来识别 respond_to? 方法调用,并成功地匹配了示例代码中的 respond_to? 调用。这为下一步添加新的指令定义并替换 send 指令奠定了基础。
文章最后还简单介绍了如何使用 gdb 调试器进行类似的操作。