感觉GoLang生态一直存在问题

我16年刚毕业的时候还手写一个JSON解析器,思路就是后缀表达式和反射,实现过程也是简单粗暴,能用就行,在某些场景容易出现性能瓶颈。

后续见识到Java生态圈众多JSON工具,学习到不少优化手段,但这些工具恰恰是GoLang生态所缺乏的。

第一个手段是字节码增强,通过reflectasm或者bytebuddy等库生成字节码的方式,生成对应字段的setter和getter方法,饶开反射来提高效率。

目前GoLang的生态也有这类的工具,但局限在于需要通过外部工具先生成代码比较麻烦。

第二个手段是事件驱动的反序列化引擎。某些的场景,返回JSON字符流很长,但往往只需要获取其中一两个字段即可,不需要全部反序列化JSON字符流,可以通过事件驱动的方式进行处理,减少CPU和内存消耗!特别适合采取GraphQL这样统一入口的场景,入口只需要解析开头几个字段,将剩下的内容交给下一跳服务继续解析。

目前GoLang的生态是没有见到类似的工具和库!但像k8s的apiserver先获取GroupVersionKind字段,再转其他组件模块处理的场景,前后至少需要两次反序列化,性能确实糟糕,很需要事件驱动的优化手段。

第三个手段是自动向量化,需要手写汇编调取SIMD指令加速,性能提升明显,但需要编码人员熟悉各平台的SIMD指令,难度较大且难以保证跨平台兼容性!

除此之外,还有CapNproto和flatbuffer这类不需要序列化的工具,不在本文的讨论范围。