什么是TLV存储格式以及为什么Protocol Buffer要比Json和XML传输时要快

Posted 17岁boy想当攻城狮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是TLV存储格式以及为什么Protocol Buffer要比Json和XML传输时要快相关的知识,希望对你有一定的参考价值。

这是Protocol Buffer里的一种存储格式,即:Tag(标识) - Lenght(长度) - Value(字节值)

为什么Protocol Buffer会比Json与XML要快呢?就体现在这点上面,在传输过程中Json与XML是直接把原生的字符串给你传输过去了,不做任何编码处理,纯粹就是字符串解析,比如:

在Protocol Buffer中定义一个消息:

message Person 
    int32 age = 1;

仅仅定义一个age的元素,其ID编号为1

然后在用XML定义一个同样的结构元素:

Body
    <name>test<name>

在发送时XML是以字符形式发送出去的,上面的总字符占用:24个字节,一个字符一个字节,而Protocol Buffer不一样,它会将其转化为:Tag(4字节) - Len(4字节) - Value(4字节),总共十二个字节,比XML小了一倍,但是Protocol Buffer有个缺点,就是要求两端通讯程序必须使用同一个生成的people.pb.h文件,这个文件里包含了对每个属性访问的接口,会根据Tag和Len来分配对应的大小空间以及放入对应的元素数组里,最终我们定义的age其实最后都只会变成这个数组里的一个ID,同时又大大减少了Name的长度,然后通过映射访问不同的元素,只是生成的访问接口以属性名生成而已。

其实Protocol Buffer就是把更多的时间用在了编码上,因为随着CPU的发展运算能力越来越强了,这点编码过程对于计算机来说是微不足道的的,网络还需要考虑当前网络情况,是否拥堵等等,所以在本地做编码在发送的方法能大大提升传输效率,同时XML格式还会把字符串的分隔符也放入进去,但Protocol Buffer不一样,它的内存非常紧凑,每隔TLV都是相邻的,没有任何分隔符。

同时它还支持Var属性,就是根据你变量的数值来自动来调节你的字节,如age是32,会简化成int8,用1个字节来存储,因为Protocol Buffer认为一个字节就能存储这个值了,不必要浪费空间,这样又提升了传输空间,并且它没有Lenght这个字节,它是用Value字节的最高位来判断是0还是1,如是1则有后续字节,则会继续往后读,如果为0则认为无后续字节。

以上是关于什么是TLV存储格式以及为什么Protocol Buffer要比Json和XML传输时要快的主要内容,如果未能解决你的问题,请参考以下文章

Protocol Buffer 序列化原理解析 - 为什么Protocol Buffer性能这么好?

Protocol Buffer 序列化原理大揭秘 - 为什么Protocol Buffer性能这么好?

华为OD机试真题 Python 实现TLV解析

华为机试真题 C++ 实现TLV解析Ⅰ

华为机试真题 Java 实现TLV解析Ⅰ

华为OD机试 - TLV解码(Java) | 机试题+算法思路+考点+代码解析 2023