在 Go 中的动态 Protobuf 解析速度提高了 10 倍,甚至比生成的代码还要快 3 倍。
hyperpb 是一个高度优化的动态消息库,适用于 Protobuf 或只读工作负载。它旨在作为 [dynamicpb][dynamicpb] 的替代方案,protobuf-go 中用于处理完全动态消息的标准解决方案。hyperpb 的解析器是一种高效的虚拟机,支持特殊指令集,是 [UPB 项目][upb] 开创的表驱动解析 (TDP) 的一种变体。我们的解析器速度非常快,比 dynamicpb 快 10 倍,而且通常比 protobuf-go 生成的代码快 2-3 倍,尤其是在具有许多嵌套消息的工作负载中。
这里我们展示了 hyperpb 的两个基准版本:不启用任何优化的原生性能,以及启用我们目前提供的所有优化的实时配置指导优化 (PGO)。这些基准是您可以使用 make bench 运行的子集。
hyperpb 的核心思想是,您必须在运行时使用 hyperpb.Compile 预编译解析器,就像正则表达式需要使用 regexp.Compile 一样。这样做可以让 hyperpb 对消息进行优化,将其延迟到运行时,这使我们能够不断改进布局优化,而无需对源代码进行任何破坏性更改。
目前, hyperpb 仅支持通过反射 API 操作消息;当您需要编写一个非常通用的服务,从网络上下载类型并使用这些类型解析消息时,它表现最好,这迫使您使用反射。
暂无开放 Issues,或尚未同步最近议题。