使用protobuf构建器作为通用数据对象的性能分析

时间:2014-02-05 19:05:44

标签: performance protocol-buffers

由于protobuffers是java序列化的绝佳替代品,因此我们广泛使用它。此外,我们使用java构建器作为通用数据对象。在使用消息构建器,形成实例参数和形成对象的普通java基元检查构造对象的速度时,我们发现对于包含6个基本字段的对象,使用构建器构造对象(这是对象的参数)花了1.1毫秒,而使用java原语花了0.3毫秒!并列出了50个这样的领域!构建者是否很重,使用它们作为一般数据对象会在何种程度上影响构造速度?

以下是我用于分析的样本设计,

message PersonList
{
   repeated Person = 1; 

    message Person 
    {
         optional string name = 1;
         optional int32 age = 2;
         optional string place = 3;
         optional bool alive = 4;
         optional string profession = 5;
    }
}       

The java equivalent 

Class PersonList {

     List<Person> personList;

     Class Person {
         String name;
         int age;
         String place;
         boolean alive;
         String profession;
     }
    /* getters and setters*/
}  

1 个答案:

答案 0 :(得分:1)

我很难想象任何只包含“6个原始值”的东西可能需要7毫秒来构建。这可能是它应该花费的10万倍。所以我不确定我理解你在做什么。

尽管如此,由于多种原因,protobuf制造商确实比典型的POJO更复杂。例如,protobuf对象跟踪当前设置的字段。此外,重复的基元被加框,这使得它们与Java原始数组相比效率很低。因此,如果您单独测量施工时间,您可能会发现显着差异。但是,与应用程序代码的其余部分所花费的时间相比,这些效果通常无关紧要。