使用协议缓冲区的小数和日期时间的最佳方法是什么?

sor*_*rin 9 datetime decimal protocol-buffers

我想找出存储协议缓冲区支持的列表中未包含的一些常见数据类型的最佳方法.

  • datetime(秒精度)
  • datetime(毫秒精度)
  • 具有固定精度的小数
  • 精度可变的小数
  • 很多bool值(如果你有很多bool值,看起来由于它们的标签,每个都会有1-2个字节的开销.

另外,我们的想法是将它们很容易地映射到相应的C++/Python/Java数据类型.

Nic*_*ton 3

protobuf 的设计原理很可能是尽可能保持数据类型支持“原生”,以便将来很容易采用新语言。我想他们可以提供内置消息类型,但是你在哪里划清界限呢?

我的解决方案是创建两种消息类型:

DateTime
TimeSpan
Run Code Online (Sandbox Code Playgroud)

这只是因为我有 C# 背景,这些类型被认为是理所当然的。

回想起来,TimeSpanDateTime可能有点矫枉过正,但它是避免从 h/m/s 转换为 s 的“廉价”方式,反之亦然;也就是说,只需实现一个实用函数就很简单,例如:

int TimeUtility::ToSeconds(int h, int m, int s)
Run Code Online (Sandbox Code Playgroud)

Bklyn,指出堆内存用于嵌套消息;在某些情况下,这显然是非常有效的——我们应该始终了解内存的使用方式。但是,在其他情况下,这可能不太重要,因为我们更担心实现的难易程度(我认为这是 Java/C# 哲学)。

在 protobuf 中使用非内在类型还有一个小缺点TextFormat::Printer;您无法指定它的显示格式,因此它看起来像:

my_datetime {
    seconds: 10
    minutes: 25
    hours: 12
}
Run Code Online (Sandbox Code Playgroud)

...这对某些人来说太冗长了。也就是说,如果以秒为单位表示,则阅读起来会比较困难。

总而言之,我想说:

  • 如果您担心内存/解析效率,请使用秒/毫秒。
  • 但是,如果目标是易于实现,请使用嵌套消息(DateTime等)。