1

我是一名学生(菜鸟),负责对 google 协议缓冲区和 apache thrift 序列化包进行基准测试。

我的问题是,在 Apache Thrift 中,三个调用被序列化为字符串......但在谷歌协议缓冲区中,只有一个调用被调用。

三个 apache thrift 调用是在序列化之前设置内存。

我是否应该在我的 apache thrift 基准测试中包含这些内存设置功能,以等同于谷歌调用?

是否有任何指南帖子或最佳实践来对此类进行基准测试?

#apache thrift
person1 = Person()
person1.name = "person1"
person1.id = 1
person1.email = "test@test.com"
#three calls
transportOut = TTransport.TMemoryBuffer()
protocolOut = TBinaryProtocol.TBinaryProtocol(transportOut)
person1.write(protocolOut)



#google protocol
person1 = Person()
person1.name="person1"
person1.id=1
person1.email="test@test.com"
#one call
person1.SerializeToString()

提前致谢!

4

2 回答 2

1

可能您正在尝试将其作为更高级别解决方案的一部分进行基准测试。所以这听起来只是我对整个事物进行基准测试的结果,而不仅仅是它的一部分。

PS:顺便说一下,很高兴了解您的发现。

于 2013-10-07T23:30:18.700 回答
1

API 的准确使用确实可以对基准性能产生巨大影响,尽管是一次调用还是三次调用不一定是核心问题。例如,在 Protobuf-C++ 中,您可以使用SerializeToString()获取std::string,但如果您最终将该字符串写入文件,使用SerializeToFileDescriptor(). 您需要谨慎使用最佳 API 来创建公平的基准。

在 Python(看起来您正在使用它)中,除了字符串之外,没有其他方法可以序列化。但是,有SerializePartialToString()哪些跳过检查 required 是否存在。使用它可能会对性能产生影响,因为它所做的工作较少。放弃这项工作是否“公平”值得商榷——许多应用程序实际上不希望进行必需的字段检查,但其他应用程序则需要。这是基准变得非常模糊的地方。

我想 Thrift 也有类似的问题,尽管我对它的 API 不是很熟悉。

最终,您需要仔细研究可用的 API,确定您想要针对的特定用例,然后选择您认为最适合该用例的应用程序。

不过,要回答您的具体问题,我认为您应该包括特定于特定消息实例的所有设置。一个苹果对苹果的比较应该包括所有每个消息实例的设置和拆卸。

顺便说一句,一定要尝试启用支持C 扩展的 Protobuf-Python 实现(页面底部)。它要快得多。当然,这带来了另一个用例问题:您是否在想象允许 C 扩展的情况?例如,它们在 AppEngine 上是不允许的。(顺便说一句,我不确定 Thrift 是否使用 C 扩展;你应该检查一下。)

Cap'n Proto进行比较可能会很有趣。(披露:我是 C++ 中的 Cap'n Proto 的作者,并且(过去)也是 C++ 和 Java 中的 Protobufs v2 的作者,但在这两种情况下都不是 Python 版本的作者。)

于 2013-10-08T21:18:20.670 回答