极致性能优化
Fury,一款基于JIT动态编译的高性能多语言序列化框架,旨在为大多数类动态生成序列化代码,以减少虚方法调用、条件分支、Hash查找等开销,从而实现与kryo相比10~40倍的高性能。
在进行性能测试时,发现Fury在处理大对象时的性能提升并未达到数十倍的目标,这可能与JVM JIT编译与内联有关。本文将阐述如何通过分析和优化,实现数十倍性能提升。
分析步骤分为两部分:首先,通过命令行查看JVM相关参数,确认当前使用的JIT编译器及编译参数。在macOS与JDK8环境下,使用的是默认的server模式和分层编译选项。注意某些不可调整参数需查看JDK源码以获取详细信息。
接着,打开编译器日志,关注tiered_level、size和deopt,以检查编译过程是否存在异常。使用特定参数打印JVM JIT编译日志,日志由五个部分组成,通过分析这些信息,重点关注Fury生成代码的最终tier level 4部分,忽略无意义的内联优化信息。
确认Fury生成的代码过大,无法在内联过程中达到最优状态。优化策略在于将生成的代码进行拆分,将其转换为多个小方法,再在其他方法中调用这些小方法。这一过程需要基于规则对表达式树进行切割,为每个子树生成单独的方法,并在表达式树的父类节点调用相关方法。面对的主要挑战在于如何高效地进行代码拆分与调用。
在优化后,JIT日志显示几乎所有代码已被完全内联,达到了预期的优化效果。在处理大对象场景时,此类优化能够实现数十倍的性能提升。
欢迎参与Fury社区,无论是提问、代码贡献还是技术讨论,都对项目发展至关重要。期待您的参与,共同推动项目向前发展,打造最先进序列化框架。
多重随机标签