基准测试两个包的差异?

时间:2013-10-07 23:28:06

标签: serialization benchmarking protocol-buffers thrift

我是一名学生(noob),负责基准谷歌协议缓冲区和apache thrift序列化包。

我的问题是,在Apache Thrift中,THREE调用序列化为字符串...但在谷歌协议缓冲区中只进行了一次调用。

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

我应该在apache thrift的基准测试中包含那些内存设置功能,以等同于google调用吗?

是否有针对此类基准测试的指南或最佳做法?

#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()

提前致谢!

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

在Python(它看起来像你正在使用)中,没有其他方法可以序列化而不是字符串。但是,SerializePartialToString()会跳过检查是否存在必需项。使用它可能会对性能产生影响,因为它的工作量较少。是否放弃这项工作是“公平的”是值得商榷的 - 许多应用程序实际上不希望进行必要的现场检查,但其他应用程序确实如此。这是基准变得非常模糊的地方。

我认为Thrift有类似的问题,但我对它的API不是很熟悉。

最终,您需要仔细研究可用的API,确定要定位的具体用例,然后选择您认为最适合该案例的内容。

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

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

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

相关问题