[protobuf] Re: Java: how to use protobuf to send messages quickly over sockets?

2009-10-30 Thread jta23

I'm a bit embarrassed :)

The protobuf version of my code uses about 950MB of memory (the Java
Serializable version is only using around 650MB) and I had the java -
Xmx flag set too low; in reality protobuf is extremely fast compared
to Java Serializable:

Java Serializable:
12,000 msgs/sec

Protocol Buffers (as described in my first post):
70,000 msgs/sec

Protocol Buffers (CodedOutputStream, as described in Evan's post):
73,000 msgs/sec

Protocol Buffers (CodedOutputStream, but no flush() after each write):
76,600 msgs/sec


Thanks very much for the help, I'm very happy with the performance!

Jonathan
--~--~-~--~~~---~--~~
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
-~--~~~~--~~--~--~---



[protobuf] Java: how to use protobuf to send messages quickly over sockets?

2009-10-29 Thread jta23

I'm looking to get sense if my experience sounds reasonable or if it
sounds like I'm doing something very wrong, any insight appreciated!

I have a Serializable Java object containing:

4 integers
3 bytes
2 Strings
1 short
1 double

I have a vector of about 10M objects I am sending from a server to a
client. The ObjectOutputStream for the server is created like this:

Socket clientSocket;
...
outputStream= new ObjectOutputStream(clientSocket.getOutputStream());

and the ObjectInputStream is created in a similar fashion.


I send the Serializable objects like this:

outputStream.writeObject(msg);

and receive them like this:

MyMessage msg = (MyMessage)inputStream.readObject();

On my rather slow server I can receive and process about 12K messages
a second.


Now for the Protocol Buffers part:
I used protoc to create a new Java class using:
8 int32s
2 strings
1 double

I create objects like this:

MyProtoMessage.MyMessagemsg =
MyProtoMessage.MyMessage.newBuilder()
...
.build();

and send them like this:

byte size = (byte)msg.getSerializedSize();
outputStream.writeByte(size);
outputStream.write(msg.toByteArray());

and finally they are read like this:

byte size = inputStream.readByte();
byte []bytes = new byte[size];
inputStream.readFully(bytes);
MyProtoMessage.MyMessage msg = MyProtoMessage.MyMessage.parseFrom
(bytes);

With this protobuf approach I can do about 9K a second. I also tried
writeDelimited/parseDelimited and it was even slower.

Does this sound reasonable? I expected it to be faster than the
standard Java serialization approach.

Thanks!

--~--~-~--~~~---~--~~
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
-~--~~~~--~~--~--~---



[protobuf] Re: Java: how to use protobuf to send messages quickly over sockets?

2009-10-29 Thread jta23

Thanks for the info. I thought the Java serialization metadata would
have been large compared to the relevant data, but I guess not!

On Oct 29, 5:42 pm, Kenton Varda ken...@google.com wrote:
 It sounds plausible.  There's no fundamental reason why protocol buffers
 should be faster than Java serialization, at least for simple objects like
 yours composed of a set of primitive values.  Since Java serialization is
 implemented by the VM, it can probably optimize better than protobufs can.
  However, the protobuf wire format is considerably simpler, portable to many
 languages other than Java, and handles extensibility better.  Also, I
 suspect you'll find that Java serialization gets slower with more complex
 object trees.  And finally, Java serialization involves sending a large
 chunk of metadata over the wire, basically describing each class -- protocol
 buffers avoids this by assuming that the receiver already knows the type
 information.  But when sending a giant homogeneous array of simple objects,
 the metadata overhead ends up small.



 On Thu, Oct 29, 2009 at 1:45 PM, jta23 jonathanhalc...@gmail.com wrote:

  I'm looking to get sense if my experience sounds reasonable or if it
  sounds like I'm doing something very wrong, any insight appreciated!

  I have a Serializable Java object containing:

  4 integers
  3 bytes
  2 Strings
  1 short
  1 double

  I have a vector of about 10M objects I am sending from a server to a
  client. The ObjectOutputStream for the server is created like this:

  Socket clientSocket;
  ...
  outputStream    = new ObjectOutputStream(clientSocket.getOutputStream());

  and the ObjectInputStream is created in a similar fashion.

  I send the Serializable objects like this:

  outputStream.writeObject(msg);

  and receive them like this:

  MyMessage msg = (MyMessage)inputStream.readObject();

  On my rather slow server I can receive and process about 12K messages
  a second.

  Now for the Protocol Buffers part:
  I used protoc to create a new Java class using:
  8 int32s
  2 strings
  1 double

  I create objects like this:

  MyProtoMessage.MyMessage        msg =
  MyProtoMessage.MyMessage.newBuilder()
  ...
  .build();

  and send them like this:

  byte size = (byte)msg.getSerializedSize();
  outputStream.writeByte(size);
  outputStream.write(msg.toByteArray());

  and finally they are read like this:

  byte size = inputStream.readByte();
  byte []bytes = new byte[size];
  inputStream.readFully(bytes);
  MyProtoMessage.MyMessage msg = MyProtoMessage.MyMessage.parseFrom
  (bytes);

  With this protobuf approach I can do about 9K a second. I also tried
  writeDelimited/parseDelimited and it was even slower.

  Does this sound reasonable? I expected it to be faster than the
  standard Java serialization approach.

  Thanks!
--~--~-~--~~~---~--~~
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
-~--~~~~--~~--~--~---