The dominant data interchange formats encode integers using a variable number of bytes or represent floating-point numbers as variable-length UTF-8 strings. The decoder must inspect each byte for a continuation bit or parse each character individually, producing data-dependent branches that stall modern CPU pipelines. Protocol Buffers pays this cost on every integer, field tag, and length prefix. JSON pays it on every value. We present Bebop, a serialization format where every data type uses a fixed number of bytes. A 32-bit integer is always four bytes. Decoding becomes a single memory read with no conditionals. Across 19 decode workloads, Bebop decodes 9--213$\times$ faster than Protocol Buffers. On a 1536-dimension embedding vector, Bebop decodes in 2.8 nanoseconds versus 111 nanoseconds for Protocol Buffers and 4.69 microseconds for simdjson, a 1,675$\times$ gap. On records above 64 KB, the decoder achieves 86% of peak memory bandwidth. The CPU is no longer the bottleneck. We also present a transport-agnostic RPC protocol built on the same wire format. The protocol introduces batch pipelining, where dependent cross-service calls execute in a single round trip with server-side dependency resolution. It deploys over HTTP/1.1, HTTP/2, and binary transports without proxies, removing the HTTP/2 requirement that limits gRPC on serverless platforms and in browsers.
翻译:主流数据交换格式通过可变长度字节编码整数,或以可变长度UTF-8字符串表示浮点数。解码器需逐字节检查续传位或逐字符解析,产生依赖数据的分支指令,导致现代CPU流水线停滞。Protocol Buffers在每个整数、字段标签和长度前缀上均需付出此代价,JSON则在每个值上付出代价。我们提出Bebop序列化格式,其所有数据类型均采用固定长度字节编码:32位整数固定占4字节,解码仅需单次无条件内存读取。在19个解码负载测试中,Bebop解码速度比Protocol Buffers快9--213倍。针对1536维嵌入向量,Bebop解码耗时2.8纳秒,而Protocol Buffers为111纳秒,simdjson达4.69微秒(性能差距1675倍)。对于超过64KB的记录,解码器可实现峰值内存带宽的86%,CPU不再是瓶颈。我们还基于相同线格式构建了传输无关的RPC协议。该协议引入批量流水线机制,支持跨服务依赖调用在单次往返中完成,由服务端解析依赖关系。它无需代理即可部署于HTTP/1.1、HTTP/2及二进制传输协议,消除了限制gRPC在无服务器平台和浏览器中应用的HTTP/2要求。