Here the result when passing a list of 1000 pojos from the client to the server: Duration using Java Serial > Protocol Buffers Serial > Java External > Protocol Buffers External Average remote time = 3539624170 > 4691285205 > 3364781976 > 4805589816 nanosecs Average serialization time = 4928 > 22203 > 2450 > 10963 nanosecs Average de-serialization time = 2742 > 5354 > 2374 > 5790 nanosecs
Compared to passing a single pojo: Duration using Java Serial > Protocol Buffers Serial > Java External > Protocol Buffers External Average remote time = 422374212 > 430878925 > 370977875 > 409553449 nanosecs Average serialization time = 38552 > 2196927 > 35479 > 65651 nanosecs Average de-serialization time = 4373 > 5000 > 3629 > 4785 nanosecs The serialization using PB + Externalizable (10963) is by a factor 5 slower than using Java + Externalizable (2450)! For a single Pojo the factor was a little less than a factor of 2 (35479 > 65651). Tai On Aug 18, 6:58 pm, Tai <maitai.tru...@gmail.com> wrote: > Hi Brice, > > I have considered your input and uses Externalizable. My results > compares Java vs. PB and Serialization vs. Externalization: > > Duration using Java Serial > Protocol Buffers Serial > Java External > > Protocol Buffers External > 1. Average remote time = 398658488 > 443504551 > 372961228 > 380994372 > nanosecs > 2. Average serialization time = 29613 > 2192178 > 27937 > 57270 > nanosecs > 3. Average de-serialization time = 3439 > 4737 > 2989 > 4456 nanosecs > > For 1) > As you can see the overall remote call is faster using Externalizable > compared to Serizalizable. But in both cases PB is slightly slower > than Java. > For 2) > The serialization using Externalizable is slightly better for Java > (29613 / 27937). For PB it is a huge difference using Externalizable > (2192178 / 57270). But PB compared to Java is still slower. > For 3) > Using Externalizable for de-serialization is slightly better. But here > again PB is slower than Java. > > Your suggestion to create builder once in the constructor for > immutable objects is good. In our case it is a no-opt since they are > not immutable. > > In my performance test I have two String (with key "key" and value > "value") and one boolean member. In a production environment my key is > max 30 and the value 50 chars long. For that I get: > > Duration using Java Serial > Protocol Buffers Serial > Java External > > Protocol Buffers External > Average remote time = 422374212 > 430878925 > 370977875 > 409553449 > nanosecs > Average serialization time = 38552 > 2196927 > 35479 > 65651 nanosecs > Average de-serialization time = 4373 > 5000 > 3629 > 4785 nanosecs > > This result brings me to the same conclusion as mentioned above. The > next thing I will try is to have Pojo with a lot more members. Also I > will try to pass a list of pojos from the client to the server. This > would then cover our production environment. Looking at the > performance in general I think the biggest boost would be in the byte > size of a PB message. The biggest performance bottleneck is the > network transmission and therefor the byte size should quite have a > big impact on the performance. The other performance issues for object > creation, serialization and deserialization is quite small compared to > the remote call. > > Tai > > On Aug 18, 5:12 pm, Brice Figureau <brice...@daysofwonder.com> wrote: > > > On Tue, 2009-08-18 at 07:43 -0700, Tai wrote: > > > What I am measuring in writeObject() and readObject() is: > > > > 1) For PB I only measure the writeDelimitedTo() and parseDelimitedFrom > > > public class PojoUsingPB extends AbstractPojo implements Serializable > > > { > > > ... > > > private void writeObject(java.io.ObjectOutputStream out) throws > > > IOException { > > > ... > > > long start = System.nanoTime(); > > > message.writeDelimitedTo(out); > > > long end = System.nanoTime(); > > > ... > > > } > > > > private void readObject(java.io.ObjectInputStream in) > > > throws ClassNotFoundException, IOException { > > > long start = System.nanoTime(); > > > PojoMessage.Pojo message = PojoMessage.Pojo.parseDelimitedFrom > > > (in); > > > long end = System.nanoTime(); > > > ... > > > > 2) In Java I measure the ObjectOutputStream.writeObject() and > > > ObjectInputStream.readObject(): > > > public class PojoUsingJava extends AbstractPojo implements > > > Serializable { > > > ... > > > private void writeObject(java.io.ObjectOutputStream out) throws > > > IOException { > > > long start = System.nanoTime(); > > > out.writeObject(key); > > > out.writeObject(value); > > > out.writeBoolean(someBoolean); > > > long end = System.nanoTime(); > > > ... > > > } > > > > private void readObject(java.io.ObjectInputStream in) > > > throws ClassNotFoundException, IOException { > > > long start = System.nanoTime(); > > > key = (String) in.readObject(); > > > value = (String) in.readObject(); > > > someBoolean = in.readBoolean(); > > > long end = System.nanoTime(); > > > ... > > > > I don't know where I could have done something wrong. The results I am > > > getting is: > > > Duration using Java > Protocol Buffers > > > Average remote time = 111309 > 122173 nanosecs > > > Average serialization time = 3609 > 6586 nanosecs > > > Average de-serialization time = 3533 > 9287 nanosecs > > > > Based on that PB seems to be slower and I am not coming to the same > > > conclusion as stated in other performance tests?! > > > That's because you create a PB, builder and call build for each written > > object. > > The Java serialization doesn't have to do that, it just feeds the fields > > of your POJO directly to the stream. > > > And the same applies to the deserialization. > > > If you were writing much more than 2 fields, then you'd see the weight > > of creating the objects be less compared to the serialization time. > > > I'm not familiar with Java Serialization (anymore), but I think I > > remember overriding writeObject and readObject still uses java > > serialization for some parts of the current object (including > > superclass, and so on). > > Shouldn't you use instead an Externalizable object? > > > My suggestion: > > * benchmark in situation or with larger close to production objects > > * if your objects are immutable, create the builder in your > > constructer, and build at that time. This way you can write multiple > > time without incurring the creation cost. > > * use an Externalizable object > > > HTH, > > -- > > Brice Figureau > > My Blog:http://www.masterzen.fr/ --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Protocol Buffers" group. To post to this group, send email to protobuf@googlegroups.com To unsubscribe from this group, send email to protobuf+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/protobuf?hl=en -~----------~----~----~----~------~----~------~--~---