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

Reply via email to