What version of protocol buffers are you using? If it's 2.0.3 or previous then you need to put this line in your proto files: option optimize_for = SPEED;
In 2.1.0 and up, this is the default. On Mon, Aug 17, 2009 at 10:29 AM, Tai <[email protected]> wrote: > > Hi, > > I did some simple test to compare Java vs. ProtocolBuffers. I know > that there is already a very verbose benchmark measuring > serialization, object creation and de-serialization here: > http://www.eishay.com/2009/03/more-on-benchmarking-java-serialization.html > > But when using RMI I am getting a total time where PB is slower than > Java. My performance test measures the total time when passing a Pojo > from a client to a remote agent. The results I get when running the > tests twice are: > Average Java time: 147421 nanosecs > Average PB time: 281617 nanosecs (factor 1.91 slower) > > Average Java time: 232446 nanosecs > Average PB time: 467485 nanosecs (factor 2.01 slower) > > I was expecting PB to be faster than Java?! But this seems to be > wrong. > > My classes are (unfortunately I cannot attach to the source / you can > email me if you want a zip): > > The rmi interface for the agent server: > ========================================================= > package test.protocolbuffers; > > import java.rmi.Remote; > import java.rmi.RemoteException; > > public interface IRemoteAgent extends Remote { > > long doSomething(long start, Object pojo) throws RemoteException; > > } > ========================================================= > > The server agent implementing the interface > ========================================================= > package test.protocolbuffers; > > import java.rmi.RemoteException; > import java.rmi.registry.LocateRegistry; > import java.rmi.registry.Registry; > import java.rmi.server.UnicastRemoteObject; > > public class RemoteAgent implements IRemoteAgent { > > public RemoteAgent() { > } > > public static void main(String[] args) throws Exception { > RemoteAgent agent = new RemoteAgent(); > String name = "RemoteAgent1"; > UnicastRemoteObject.exportObject(agent, 0); > Registry registry; > try { > registry = LocateRegistry.createRegistry(1099); > } catch (Exception e) { > registry = LocateRegistry.getRegistry(); > } > registry.rebind(name, agent); > System.out.println(name + " bound."); > > } > > public long doSomething(long start, Object pojo) throws > RemoteException { > long end = System.nanoTime(); > return end - start; > } > } > ========================================================= > > The Java POJO for measuring the using standard Java serialization: > ========================================================= > package test.protocolbuffers; > > import java.io.Serializable; > > public class PojoUsingJava implements Serializable { > private String key; > private String value; > private boolean someBoolean; > > public PojoUsingJava(String key, String value, boolean > someBoolean) { > this.key = key; > this.value = value; > this.someBoolean = someBoolean; > } > > } > ========================================================= > > The PB Pojo: > ========================================================= > package test.protocolbuffers; > > import java.io.IOException; > import java.io.Serializable; > import test.protocolbuffers.PojoMessage.Pojo.Builder; > > public class PojoUsingPB implements Serializable { > private String key; > private String value; > private boolean someBoolean; > > public PojoUsingPB(String key, String value, boolean someBoolean) > { > this.key = key; > this.value = value; > this.someBoolean = someBoolean; > } > > private void writeObject(java.io.ObjectOutputStream out) throws > IOException { > Builder builder = PojoMessage.Pojo.newBuilder(); > builder.setKey(key); > builder.setValue(value); > builder.setSomeBoolean(someBoolean); > PojoMessage.Pojo message = builder.build(); > message.writeTo(out); > } > > private void readObject(java.io.ObjectInputStream in) > throws ClassNotFoundException, IOException { > PojoMessage.Pojo message = PojoMessage.Pojo.parseFrom(in); > key = message.getKey(); > value = message.getValue(); > someBoolean = message.getSomeBoolean(); > } > > } > ========================================================= > > The proto file being used in the PB Pojo: > ========================================================= > package test.protocolbuffers; > > option optimize_for = SPEED; > > message Pojo { > > optional string key = 1; > optional string value = 2; > optional bool someBoolean = 3; > }========================================================= > > The test class for measuring the remote calls using Java and PB: > ========================================================= > package test.protocolbuffers; > > import java.rmi.registry.LocateRegistry; > import java.rmi.registry.Registry; > > public class RemoteProtoPerfTest { > > public static void main(String[] args) throws Exception { > //get the remote agent > Registry registry = LocateRegistry.getRegistry(1099); > IRemoteAgent remoteAgent = (IRemoteAgent) registry.lookup > ("RemoteAgent1"); > // warm up > for (int i = 0; i < 100; i++) { > remoteAgent.doSomething(System.nanoTime(), "warmup"); > } > int calls = 1000; > > //measure the total time (serialization, network > transportation, deserialization) > //using java serialization > long totalJavaDuration = 0; > PojoUsingJava pojoUsingJava = new PojoUsingJava("key", > "value", false); > for (int i = 0; i < calls; i++) { > if ( i % 200 == 0) { > System.out.println("Loop: " + i); > } > totalJavaDuration += remoteAgent.doSomething > (System.nanoTime(), pojoUsingJava); > } > totalJavaDuration /= calls; > System.out.println("Average Java time: " + totalJavaDuration + > " nanosecs"); > > //measure the total time (serialization, network > transportation, deserialization) > //using Protocol Buffers > long totalPbDuration = 0; > PojoUsingPB pojoUsingPB = new PojoUsingPB("key", "value", > false); > for (int i = 0; i < calls; i++) { > if ( i % 200 == 0) { > System.out.println("Loop: " + i); > } > totalPbDuration += remoteAgent.doSomething(System.nanoTime > (), pojoUsingPB); > } > totalPbDuration /= calls; > System.out.println("Average PB time: " + totalPbDuration + " > nanosecs"); > > } > > } > ========================================================= > > > > > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Protocol Buffers" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/protobuf?hl=en -~----------~----~----~----~------~----~------~--~---
