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

Performance protobuff构建器作为通用数据对象的性能分析,performance,protocol-buffers,Performance,Protocol Buffers,由于protobuffers是java序列化的一个极好的替代品,我们已经广泛地使用了它。此外,我们还使用java构建器作为通用数据对象。在检查使用message builder构造对象、形成实例参数和形成对象的普通java原语的速度时,我们发现对于包含6个原语字段的对象,使用builder(对象的参数)构造对象需要1.1ms,而使用java原语只需要0.3ms!以及50个这样的字段的列表!建设者是否很重,将其用作通用数据对象会在一定程度上影响构建速度 下面是我用于分析的样本设计 message

由于protobuffers是java序列化的一个极好的替代品,我们已经广泛地使用了它。此外,我们还使用java构建器作为通用数据对象。在检查使用message builder构造对象、形成实例参数和形成对象的普通java原语的速度时,我们发现对于包含6个原语字段的对象,使用builder(对象的参数)构造对象需要1.1ms,而使用java原语只需要0.3ms!以及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;
信息员
{
可选字符串名称=1;
可选int32年龄=2;
可选字符串位置=3;
可选bool alive=4;
可选字符串职业=5;
}
}       
java等价物
阶级人格主义者{
列出个人名单;
班主任{
字符串名;
智力年龄;
串位;
布尔活着;
弦乐专业;
}
/*接球手和接球手*/
}  

我很难想象任何只包含“6个基本值”的东西都需要7毫秒来构建。这可能是所需时间的100000倍。所以我不确定我是否理解你在做什么


也就是说,protobuf构建器确实比典型的POJO更复杂,原因有很多。例如,protobuf对象跟踪当前设置的字段。此外,重复原语被装箱,这使得它们与Java原语数组相比效率非常低。因此,如果你单独测量施工时间,你可能会看到显著的差异。但是,与应用程序代码的其余部分相比,这些影响通常是无关紧要的。

很抱歉,这些结果是错误的。。我重新进行了分析,发现使用builder和普通java对象的时间分别为1.1ms和0.3ms。。在这种情况下,时差不是什么大问题。但在列表中添加元素时,结果令人震惊。。使用上述构建器设计添加100个元素(构建器设计包括protoListbuilder上的java包装器)花了大约6毫秒,而java对象设置只花了0.4毫秒。Ya我同意你的观点,与花在应用程序代码上的时间相比,这些并不重要,但在更大的范围内,这并不重要!向列表中添加100个元素应该需要几微秒,而不是几毫秒,所以我觉得您的代码中肯定还有其他内容。但是,是的,POJO在内存数据结构方面可能比protobuf构建器表现得更好。只有在需要序列化时才使用protobuf——protobuf序列化比Java序列化快得多。