我正在开发一个小型设备,它有一组相当大的配置参数(~100 KB),这些参数是从 PC 软件生成的。过去,我们将参数存储在二进制文件中并将它们加载到数据结构中。维护有点烦(不同的语言,确保结构中的字段顺序匹配,不同的版本等),所以我们正在考虑去谷歌协议缓冲区。
从小型设备的角度来看,我担心存储序列化协议缓冲区所需的内存空间。我在 C 中工作,所以我下载了protobuf-embedded-c并开始研究一个示例。我对它计算的缓冲区的最大大小感到有点惊讶。例如,下面是空缓冲区的大小,然后是包含命名类型的单个变量的缓冲区:
#define MAX_M_Empty_SIZE 2
#define MAX_M_double_SIZE 12
#define MAX_M_float_SIZE 8
#define MAX_M_int32_SIZE 14
#define MAX_M_int64_SIZE 14
#define MAX_M_uint32_SIZE 9
#define MAX_M_uint64_SIZE 14
#define MAX_M_sint32_SIZE 9
#define MAX_M_sint64_SIZE 14
#define MAX_M_fixed32_SIZE 8
#define MAX_M_fixed64_SIZE 12
#define MAX_M_sfixed32_SIZE 8
#define MAX_M_sfixed64_SIZE 12
#define MAX_M_bool_SIZE 5
每次我在结构中添加一个“int32”时,最大大小增加了 14 个字节。我知道这包括变体编码的关键和可能最坏的情况,但是我能期待什么?较大的消息比较小的消息更有效,还是更依赖于编码值?
总之,我只是想了解协议缓冲区上的内存空间使用情况。我讨厌用易用性换取大量增加存储配置数据所需的内存空间。谢谢!